带有ItemTemplate的WPF ComboBox Text属性为空

时间:2015-01-28 17:56:51

标签: wpf xaml combobox itemtemplate

我有一个ComboBox,它使用一个由CheckBox和TextBlock组成的ItemTemplate。我的目标是,当选中/取消选中项目时,折叠的组合框会显示一个以逗号分隔的已检查项目列表。我认为ComboBox的Text属性可以用于此目的,但这仅在IsEditable = true时启用,否则即使绑定到属性也只是空白。我不希望组合可以编辑。

如果我能提供某种简单的模板来显示由列表中的已检查项组成的属性,那将是很好的。这可能吗?

<ComboBox ItemsSource="{Binding Issues}" Text="{Binding IssuesCSV}">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <CheckBox IsChecked="{Binding IsSelected, Mode=TwoWay}" Margin="4 0 4 0" 
                          IsEnabled="{Binding IsEnabled}" />
                <TextBlock Text="{Binding Issue.Number}" />
            </StackPanel>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

1 个答案:

答案 0 :(得分:0)

您想要的行为与ComboBox不同,您可能需要考虑将自己构建为自定义控件。

但是......我认为 是一种从ComboBox中获取所需内容的方法

首先,创建一个VisualBrush资源并将其绑定到IssuesCSV值:

 <Window.Resources>
    <VisualBrush x:Key="TextBrush" TileMode="None" Opacity="0.4" Stretch="None" AlignmentX="Left">
        <VisualBrush.Visual>
            <TextBlock Text="{Binding IssuesCSV}"/>
        </VisualBrush.Visual>
    </VisualBrush>
</Window.Resources>

然后,设置ComboBox的background属性以使用该画笔资源:

<ComboBox ... Background="{StaticResource TextBrush}" ... />

然后,将ComboBox设置为可编辑,但只读。这将使不可编辑的ComboBox的银色默认样式在下拉期间不会覆盖您的文本:(您也可以使用ComboBox样式来实现此目的,同时保持ComboBox真正不可编辑)

<ComboBox ... IsReadOnly="True" IsEditable="True" ... />

最后,通过为SelectionChanged事件提供处理程序来阻止用户实际选择ComboBoxItem,该事件只是将SelectedItem设置为null:

<ComboBox ... SelectionChanged="myCB_SelectionChanged" ... />

private void myCB_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
   myCB.SelectedItem = null;
}