自定义模板化listboxitem触发器绑定到列表框

时间:2011-10-03 11:20:06

标签: wpf templates triggers listbox

我有一个继承自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;
     }
}

1 个答案:

答案 0 :(得分:1)

首先,很少有建议......

您的自定义列表框控件是否具有新属性(IsSymbolExists等)并且没有真实的行为。如果是,请将其声明为Attached Properties

其次,当此值{​​{1}}对于ListBox ALL 变为true时,其项目将由黄色边框单独突出显示。这看起来不像一个深思熟虑的UI行为。对不起,如果你觉得有点苛刻!

同样从绑定角度来看,IsSymbolExists属性看起来像一个基于数据上下文的属性,即来自某个模型。如果是这样,则必须通过DataChar下的ItemTemplate进行绑定,而不是ListBox TextBlock下的ControlTemplate。出于完全相同的原因,ListBoxItem无法在DataTrigger中正常运行。

它们可以在ControlTemplate中正常使用。

总而言之,您的代码需要以这种方式修复......

  1. 您可以摆脱 ItemTemplate。创建一个名为CustomListBox的布尔附加属性。将它附加到ListBox。

  2. 你应该摆脱MyListBoxBehavior.IsSymbolExists的{​​{1}}。

  3. 在ListBox中从此处获取帮助...(此代码不会按原样编译): - )

    ListBoxItem

    希望这有帮助。