多选WPF组合框

mnemlml8  于 2023-02-05  发布在  其他
关注(0)|答案(2)|浏览(166)

我有一个WPF组合框,其中ItemsSourceObservableCollection<User>,而Userstring Namebool IsChecked
我也有

<ComboBox.ItemTemplate>
    <DataTemplate>
        <StackPanel Orientation="Horizontal">
            <CheckBox IsChecked="{Binding IsChecked}" Width="20" />
            <TextBlock Text="{Binding Name}" />
         </StackPanel>
     </DataTemplate>
</ComboBox.ItemTemplate>

,它很好地在每个名称前显示复选框,并允许我选中/取消选中用户。
我需要的是使组合框选定的项目,以显示不是选定的用户,但所有选中的用户名用逗号分隔,理想的(如果结果字符串太长)与省略号在中间,即"爱丽丝,巴特...喵,约翰"。
可能吗?

mznpcxlj

mznpcxlj1#

我本打算建议使用exceed复选框
https://github.com/xceedsoftware/wpftoolkit/wiki/CheckComboBox
但是我注意到它不再是免费的商业应用了,你可以根据他们的代码构建你自己的东西。
xaml也会在那个repo中。

tvz2xvvm

tvz2xvvm2#

实现起来有点棘手,但肯定可以做到。
首先,你需要用TextBlock替换下拉栏/按钮,所以你需要修改控件的模板。将编辑光标放在父ComboBox声明内的任何地方,这样控件就出现在右下角的属性面板中。在属性中,找到底部的杂项-〉模板。然后点击右边的小向下箭头,选择“转换为新资源”。这将模板化控件,以便您可以开始编辑它。
接下来,在ControlTemplate中找到ToggleButton的ContentPresenter,然后修改它的Content绑定,使其指向视图模型中的一个属性,我将其命名为Names

<!--<ContentPresenter x:Name="contentPresenter" ContentStringFormat="{TemplateBinding SelectionBoxItemStringFormat}" ContentTemplate="{TemplateBinding SelectionBoxItemTemplate}" Content="{TemplateBinding SelectionBoxItem}" ContentTemplateSelector="{TemplateBinding ItemTemplateSelector}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" IsHitTestVisible="false" Margin="{TemplateBinding Padding}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>-->
<ContentPresenter x:Name="contentPresenter" ContentTemplate="{TemplateBinding SelectionBoxItemTemplate}" Content="{Binding Names}" ContentTemplateSelector="{TemplateBinding ItemTemplateSelector}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" IsHitTestVisible="false" Margin="{TemplateBinding Padding}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>

下一个更改是向CheckBox命令属性添加一个名为“NamesChangedCommand”的绑定,每当用户更改CheckBox的状态时都会调用该绑定:

<CheckBox IsChecked="{Binding IsChecked}" Width="20" Command="{Binding RelativeSource={RelativeSource AncestorType=ComboBox}, Path=DataContext.NamesChangedCommand}" />

然后回到视图模型中,你所要做的就是执行这个命令,并让它生成新的名字列表,下面是你在MVVM工具包中的实现方法:

[RelayCommand]
    public void NamesChanged()
    {
        this.Names = String.Join(", ",
            this.Items
                .Where(item => item.IsChecked)
                .Select(item => item.Name));
    }

    [ObservableProperty]
    private string names = "";

结果:

相关问题