在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。
感谢名单
答案 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;
}
}
}
}