如何将ComboBox文本设置为以逗号分隔的所选项目列表?

时间:2013-01-09 16:18:02

标签: wpf checkbox combobox

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

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

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; }
}

我该如何做到这一点?

2 个答案:

答案 0 :(得分:0)

由于您需要的行为,使用Expander或{{1}之类的内容扩展点击(PopupItemsControl等)不会是更好的解决方案用来显示你的物品?否则你可能会得到一些奇怪的选择或开/关行为。

但无论如何,我个人会创建一个包含以下内容的数据类:

ListView

做这样的事情:

         

并将PropertyChange通知添加到您的string SelectedItems { get; set; } ObservableCollection<Enviornment> AvailableItems { get; set; } 课程,以便您可以执行以下操作:

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()); } 是否是框架的一部分,但是如果不是,则this answer有一个很好的扩展方法,可以轻松地将List转换为数组,以便您可以使用它在ToArray()

但是,使用当前设置,您还可以向string.JoinCheckBox.CheckChanged添加一些代码隐藏,以将ComboBox.SelectionChanged转换为cmbEnvironment.ItemsSource,构建逗号分隔的字符串选中的项目,然后将List<Environment>设置为等于逗号分隔的字符串。

答案 1 :(得分:0)

对于未来的读者:我建议使用(免费)Extended WPF toolkit,它包含一个完全符合此要求的CheckComboBox。