我有一个继承自ListBox的类和一个用于ListBoxItems的自定义ControlTemplate。 如果条件为真,我想更改ListBoxItems背景。我尝试使用DataTrigger。我不想检查ListBoxItems上下文对象中的条件,我想在继承的ListBox类中检查它。
问题是当需要在运行时为每个ListBoxItem确定正确的值时,如何将ControlTemplate中的Trigger绑定到ListBox属性?
<Style x:Key="ListBoxItemStyle" TargetType="ListBoxItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
<Border Name="bd">
<TextBlock Name="lbl" Text="{Binding Path=DataChar}" FontWeight="ExtraBold" FontSize="15" Margin="5"/>
</Border>
<ControlTemplate.Triggers>
<DataTrigger Binding="{Binding RelativeSource={ RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBox}}, Path=IsSymbolExists}" Value="True">
<Setter TargetName="bd" Property="Background" Value="Yellow" />
</DataTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
public class CustomListBox : ListBox
{
...
public bool IsSymbolExists
{
if(/*condition is true for the ListBoxItem*/)
return true;
return false;
}
}
答案 0 :(得分:1)
首先,很少有建议......
您的自定义列表框控件是否具有仅新属性(IsSymbolExists
等)并且没有真实的行为。如果是,请将其声明为Attached Properties
其次,当此值{{1}}对于ListBox ALL 变为true时,其项目将由黄色边框单独突出显示。这看起来不像一个深思熟虑的UI行为。对不起,如果你觉得有点苛刻!
同样从绑定角度来看,IsSymbolExists
属性看起来像一个基于数据上下文的属性,即来自某个模型。如果是这样,则必须通过DataChar
下的ItemTemplate
进行绑定,而不是ListBox
TextBlock
下的ControlTemplate
。出于完全相同的原因,ListBoxItem
无法在DataTrigger
中正常运行。
它们可以在ControlTemplate
中正常使用。
总而言之,您的代码需要以这种方式修复......
您可以摆脱 ItemTemplate
。创建一个名为CustomListBox
的布尔附加属性。将它附加到ListBox。
你应该摆脱MyListBoxBehavior.IsSymbolExists
的{{1}}。
在ListBox中从此处获取帮助...(此代码不会按原样编译): - )
ListBoxItem
希望这有帮助。