来自ViewModel的WPF按钮样式StaticResource值?

时间:2013-11-27 04:05:36

标签: c# wpf mvvm

基于我对WPF的非常新的理解,我可以在我的ViewModel中设置值并将变量绑定到WPF控件,例如:

<TextBlock Text="{Binding [SomeViewModel].selfdefinedText}"/>

现在我想知道是否有可能以相同的方式应用于StaticResource?以下通常是我引用ResourceLibrary的方式:

<Button Style="{StaticResource somestyle}"/>

现在我可以绑定一个在我的viewModel中定义的变量,而不是在这里对somestyle进行硬编码吗?

如下所示:

在我的ViewModel中:

public string TestStyle
{
    get{ return _TestStyle;}
    set{ SetProperty(ref _TestStyle, value);}
}

TestStyle = "someStyle";

然后在我的XAML中:

<Button Style="{StaticResource [SomeViewModel].TestStyle}"/>

2 个答案:

答案 0 :(得分:2)

如果您的虚拟机直接暴露Style(可能是一个坏主意),您只需:

<Button Style="{Binding SomeStyleViaViewModel}"/>

另一方面,如果您的VM正在为样式公开,则需要转换器:

<Button Style="{Binding SomeStyleKeyViaViewModel, Converter={StaticResource MyStyleConverter}}"/>

您的转换器基本上需要根据密钥查找Style

答案 1 :(得分:0)

实现此目标的一种解决方法是定义AttachedPropertyMyStyle)并将其设置在Button上。根据属性的值,将搜索样式并将其应用于Button

附属物将如下:

public static class MyStyles
{
    static FrameworkPropertyMetadata metadata = new FrameworkPropertyMetadata(
                                     string.Empty, FrameworkPropertyMetadataOptions.AffectsRender, MyStylePropertyChangeCallBack);

    public static readonly DependencyProperty MyStyleProperty =
        DependencyProperty.RegisterAttached("MyStyle", typeof (String), typeof (MyStyles), metadata);

    public static void SetStyleName(UIElement element, string value)
    {
        element.SetValue(MyStyleProperty, value);
    }
    public static Boolean GetStyleName(UIElement element)
    {
        return (Boolean)element.GetValue(MyStyleProperty);
    }


    public static void MyStylePropertyChangeCallBack(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {

        FrameworkElement ctrl = d as FrameworkElement;

        if (ctrl.IsLoaded)
        {
            string styleName = Convert.ToString(e.NewValue);
            if (!string.IsNullOrEmpty(styleName))
            {
                ctrl.Style = ctrl.TryFindResource(styleName) as Style;
            }
        }
    }
}

然后在xaml:

<Button local:MyStyles.MyStyle="{Binding TestStyle}" />