我有包含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; }
}
我该如何做到这一点?
答案 0 :(得分:0)
由于您需要的行为,使用Expander
或{{1}之类的内容扩展点击(Popup
,ItemsControl
等)不会是更好的解决方案用来显示你的物品?否则你可能会得到一些奇怪的选择或开/关行为。
但无论如何,我个人会创建一个包含以下内容的数据类:
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.Join
或CheckBox.CheckChanged
添加一些代码隐藏,以将ComboBox.SelectionChanged
转换为cmbEnvironment.ItemsSource
,构建逗号分隔的字符串选中的项目,然后将List<Environment>
设置为等于逗号分隔的字符串。
答案 1 :(得分:0)
对于未来的读者:我建议使用(免费)Extended WPF toolkit,它包含一个完全符合此要求的CheckComboBox。