我已经搜索过但尚未找到任何关于如何执行此操作的方法。我对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}"/>
答案 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中使用转换器或其他属性来创建各种类型的属性(在您的情况下为PropA
,Color
,Depth
等)设置值{ {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