根据绑定值与DataTrigger共享样式

时间:2017-03-29 07:31:04

标签: c# xaml data-binding

我已经搜索过但尚未找到任何关于如何执行此操作的方法。我对XAML和绑定也比较陌生。

我有很多TextBlocks,其中的文字绑定到一个属性并且有一个StringFormat

<TextBlock Text="{Binding PropA, StringFormat=Running {0}"/>
<TextBlock Text="{Binding Height, StringFormat=Sub: \{0\}"/>
<TextBlock Text="{Binding Depth, StringFormat=Indie: \{0\}"/>
<TextBlock Text="{Binding Color, StringFormat=State: \{0\}"/>

现在我想根据绑定变量的值应用样式(因此显示的真实文本无关紧要)。目前,我必须对每个元素应用<Style>并再次直接使用bound属性。这看起来很麻烦,并且容易出现复制粘贴错误。我想知道我是否可以定义<Style>并分享它。

类似的东西:

<Style x:Key="Highlight_Non_Zero">
  <!-- invert the logic because DataTrigger is an equality comparer -->
  <Setter Property="TextBlock.Background" Value="Orange"/>
  <Style.Triggers>
    <DataTrigger Binding="{Binding <some magic here that gets the element this style applies to bound variable>" Value="0">
      <Setter Property"TextBlock.Background" Value="Transparent"/>
    </DataTrigger>
  </Style.Triggers>
</Style>

<TextBlock Text="{Binding PropA, StringFormat=Running {0}" Style="{StaticResource Highlight_Non_Zero}"/>
<TextBlock Text="{Binding Height, StringFormat=Sub: \{0\}" Style="{StaticResource Highlight_Non_Zero}"/>
<TextBlock Text="{Binding Depth, StringFormat=Indie: \{0\}" Style="{StaticResource Highlight_Non_Zero}"/>
<TextBlock Text="{Binding Color, StringFormat=State: \{0\}" Style="{StaticResource Highlight_Non_Zero}"/>

1 个答案:

答案 0 :(得分:0)

您可以使用附加属性将 common (例如bool值)传递给样式:

public class TextBlockBehavior
{
    public static bool GetMyProperty(DependencyObject obj) => (bool)obj.GetValue(MyPropertyProperty);
    public static void SetMyProperty(DependencyObject obj, bool value) => obj.SetValue(MyPropertyProperty, value);

    public static readonly DependencyProperty MyPropertyProperty =
        DependencyProperty.RegisterAttached("MyProperty", typeof(bool), typeof(TextBlockBehavior), new PropertyMetadata(false));
}

然后每个TextBlock可以设置不同来源的值:

<TextBlock Text="{Binding PropA, StringFormat=Running \{0\}}"
           local:TextBlockBehavior.MyProperty="{Binding PropA ...}"
           Style="{StaticResource Highlight_Non_Zero}" />

注意:您必须在ViewModel中使用转换器或其他属性来创建各种类型的属性(在您的情况下为PropAColorDepth等)设置值{ {1}}。

然后你可以使用它:

bool MyProperty

如果样式触发器执行很多操作,那么解决方案很适合。在你的情况下(为了改变背景),简单地制作转换器(或使用ViewModel中的另一个属性,颜色可以返回,参见例如this)以便生成所需的背景画笔/颜色(例如<Style x:Key="Highlight_Non_Zero" TargetType="TextBlock"> <Setter Property="TextBlock.Background" Value="Orange" /> <Style.Triggers> <Trigger Property="local:TextBlockBehavior.MyProperty" Value="True"> <Setter Property="TextBlock.Background" Value="Transparent" /> </Trigger> </Style.Triggers> </Style> ):

ColorToBackground