带有ItemTemplate的WPF组合框文本属性为空

带有ItemTemplate的WPF组合框文本属性为空,wpf,xaml,combobox,itemtemplate,Wpf,Xaml,Combobox,Itemtemplate,我有一个ComboBox,它使用由复选框和文本块组成的ItemTemplate。我的目标是,当选中/取消选中项目时,折叠的组合框将显示以逗号分隔的选中项目列表。我认为ComboBox的Text属性可以用于此目的,但这仅在IsEditable=true时启用,否则即使绑定到属性,它也只是空白。我不希望组合是可编辑的 如果我能提供某种简单的模板来显示由列表中的选中项组成的属性,那就太好了。这可能吗 <ComboBox ItemsSource="{Binding Issues}" Text="{

我有一个ComboBox,它使用由复选框和文本块组成的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>


<>代码> 您所期望的行为与组合框不同,您可能需要考虑建立自定义控件。

但是。。。我认为有一种方法可以从组合框中得到你想要的东西

首先,创建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="{StaticResource TextBrush}" ... />

然后,将组合框设置为可编辑但只读。这将防止不可编辑组合框的银色默认样式在下拉过程中覆盖文本:(您也可以使用组合框样式来实现这一点,同时使组合框真正不可编辑)


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

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

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

私有无效myCB_SelectionChanged(对象发送方,SelectionChangedEventArgs e)
{
myCB.SelectedItem=null;
}
试试这里,它可能会给出一个方向
<ComboBox ... SelectionChanged="myCB_SelectionChanged" ... />

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