2011-09-27 96 views
1

我有一个ComboBox,绑定到一个DataTable。我想添加一个额外的ComboBoxItem到列表的顶部,我可以放置一个链接来自定义列表。目前我只是在我的DataTable顶部插入一个虚拟行,然后在ComboBox上使用DataTrigger使其正确显示。但是,我没有得到正确的结果。问题样式数据绑定WPF ComboBoxItem

我试过两种方法。首先,我的DataTrigger用包含TextBlock的ControlTemplate替换虚拟项。

<ComboBox IsEditable="True" Name="comboWell" ItemsSource="{Binding}" DisplayMemberPath="wellId"> 
    <ComboBox.ItemContainerStyle> 
     <Style TargetType="{x:Type ComboBoxItem}"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding wellId}" Value="(settings)"> 
        <Setter Property="Template"> 
         <Setter.Value> 
          <ControlTemplate TargetType="ComboBoxItem"> 
           <TextBlock Text="Customize..." /> 
          </ControlTemplate> 
         </Setter.Value> 
        </Setter> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </ComboBox.ItemContainerStyle> 
</ComboBox> 

结果看起来不错,但该项目上没有鼠标悬停突出显示。列表的其余部分工作正常,但是当我将鼠标悬停在其上时,其中一项完全没有反应。我尝试添加额外的触发器和样式来应用鼠标悬停效果,但我没有任何更改。

我试过的第二种方法只是改变项目的外观,而不是完全用ControlTemplate替换它。

<ComboBox IsEditable="True" Name="comboWell" ItemsSource="{Binding}" DisplayMemberPath="wellId"> 
    <ComboBox.ItemContainerStyle> 
     <Style TargetType="{x:Type ComboBoxItem}"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding wellId}" Value="(settings)"> 
        <Setter Property="Content" Value="Customize..." /> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </ComboBox.ItemContainerStyle> 
</ComboBox> 

这一个函数就像一个常规列表项,鼠标悬停工作正常。但是,该项目是空白的。原始文本和我试图在DataTrigger中设置的文本都没有。没有错误,只是一个空的列表项。

有没有更好的方法来实现这个目标?

回答

2

取出DisplayMemberPath并添加默认内容到风格

<ComboBox IsEditable="True" Name="comboWell" ItemsSource="{Binding }"> 
    <ComboBox.ItemContainerStyle> 
     <Style TargetType="{x:Type ComboBoxItem}"> 
      <Setter Property="Content" Value="{Binding wellId}" /> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding wellId}" Value="(settings)"> 
        <Setter Property="Content" Value="Customize..." /> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </ComboBox.ItemContainerStyle> 
</ComboBox> 

DisplayMemberPath实际上是说该项目模板应该只是一个TextBlock与它的文本绑定到的DisplayMemberPath项目的快捷方式,我猜测它会覆盖你在Style中的任何东西。

+0

这个伎俩!非常感谢你! – Nairou