1

我有 WPF ComboBox 包含 CheckBox 项目,它允许用户选择多个项目。

在用户从组合框中选择一个项目后,我想在组合框中将所选项目的列表显示为逗号分隔的文本。

XAML:

<ComboBox  Name="cmbEnvironment"  >
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <CheckBox IsChecked="{Binding IsSelected}" Content="{Binding Name}" />
            </StackPanel>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox> 

代码背后:

var lstEnvironment = new List<Environment>();
lstEnvironment.Add( new Environment() { Name = "Env1", IsSelected = false});
lstEnvironment.Add(new Environment() { Name = "Env2", IsSelected = false });
lstEnvironment.Add(new Environment() { Name = "Env3", IsSelected = false });
cmbEnvironment.ItemsSource = lstEnvironment;

模型:

public class Environment
{
    public string Name { get; set; }
    public bool IsSelected { get; set; }
}

我怎样才能做到这一点?

4

2 回答 2

0

由于您想要的行为,不是更好的解决方案是使用类似或用于显示您的项目的点击( Expander、、Popup等)扩展吗?否则你可能会得到一些奇怪的选择或打开/关闭行为。ItemsControlListView

但无论如何,我个人会创建一个数据类,其中包含:

string SelectedItems { get; set; }
ObservableCollection<Enviornment> AvailableItems { get; set; }

并做这样的事情:

并将 PropertyChange 通知添加到您的Enviornment班级,以便您可以执行以下操作:

foreach(var item in AvailableItems)
    item.PropertyChanged += Environment_PropertyChanged;

...

void Environment_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    if (e.PropertyName == "IsSelected")
        SelectedItems = string.Join(",", 
            availableItems.Where(p => p.IsSelected)
            .Select(p => p.Name).ToArray());
}

(我不记得是否ToArray()是框架的一部分,但是如果不是,那么这个答案有一个很好的扩展方法可以轻松地将 List 转换为 Array 以便您可以在其中使用它string.Join

但是,使用您当前的设置,您也可以将一些代码隐藏添加到CheckBox.CheckChangedComboBox.SelectionChanged转换cmbEnvironment.ItemsSourceList<Environment>,构建 Checked 项目的逗号分隔字符串,然后设置cmbEnvironment.Text为等于您的逗号分隔字符串。

于 2013-01-09T16:30:20.400 回答
0

对于未来的读者:我为此推荐(免费)扩展 WPF 工具包,它包括一个 CheckComboBox 正是这样做的。

于 2016-08-02T07:14:45.820 回答