将<object property =“{StaticResource key}”“... =”“>中的键绑定到值</object>

时间:2012-04-17 09:48:55

标签: wpf xaml data-binding mvvm staticresource

在WPF中,是否可以将“{StaticResource key}”中的键绑定到变量。

例如。我有一个变量 ExecutionState ,状态为有效已完成

在我的ResourceDictionary中我有

<Style TargetType="{x:Type TextBlock}" x:Key="Active">
        <Setter Property="Foreground" Value="Yellow"/>
    </Style>
    <Style TargetType="{x:Type TextBlock}" x:Key="Completed">
        <Setter Property="Foreground" Value="Green"/>
    </Style>

而不是

<TextBlock Style="{StaticResource Active}"/>

我想要像

这样的东西
<TextBlock Style="{StaticResource {Binding ExecutionState}}"/>

因此,如果状态改变了文本颜色的变化。 这样的事情甚至可能吗? 我可以使用触发器实现所需的功能,但我必须在多个地方重用它,我不想让我的代码混乱。 我也在使用MVVM。

感谢名单

2 个答案:

答案 0 :(得分:0)

不,这是不可能的。绑定只能在DependencyProperty上设置。 StaticResource不是DependencyObject,因此没有DependencyProperty。您应该使用Trigger(s)或开发自己的附加行为。

答案 1 :(得分:0)

没有直接的方法可以实现。 创建一个附加属性并将属性名称指定给bind。 在属性更改回调函数更新控件样式。

<TextBlock  dep:CustomStyle.StyleName="{Binding ExecutionState}"    Text="Thiru"        />


public static  class CustomStyle
{
    static FrameworkPropertyMetadata _styleMetadata = new FrameworkPropertyMetadata(
                                     string.Empty, FrameworkPropertyMetadataOptions.AffectsRender, StyleNamePropertyChangeCallBack);

    public static readonly DependencyProperty StyleNameProperty =
        DependencyProperty.RegisterAttached("StyleName", typeof (String), typeof (CustomStyle), _styleMetadata);

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


    public static void StyleNamePropertyChangeCallBack(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;
            }
        }
    }
}