我在WPF表单中有超过20个复选框,需要将所有的IsChecked
值存储在某个对象中。
我知道两种方法。
1) 使用依赖属性将所有复选框绑定到对象中的相应属性,就像这里一样。
2) 处理它们全部的Clicked
事件。
哪种解决方案更好?是否有更好的解决方案可以占用更少的代码空间?
一定要使用绑定
如果你的复选框是不相关的,分散在各处,那么你需要在你的DataContext或ViewModel中绑定20个不同的依赖属性。
如果你的复选框都在一起,比如一个接一个地列出来或者在一个网格中,你可以把它们放在一个集合中,并将ItemsControl
绑定到它们上面。
<ItemsControl ItemsSource="{Binding Options}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<CheckBox Content="{Binding Description}"
IsChecked="{Binding IsChecked}" />
</DataTemplate>
</ItemsControl>
</ItemsControl>
private List<Option> options;
private List<Option> Options
{
get
{
if (options== null)
{
options = new List<Option>();
// Load Options - For example:
options.Add(new Option { Description = "Option A", IsChecked = false });
options.Add(new Option { Description = "Option B" });
options.Add(new Option { Description = "Option C", IsChecked = true});
}
return options;
}
}
你的 Option
类将会很简单:
public class Option
{
public string Description { get; set; }
public bool IsChecked { get; set; }
}
绑定。
原因很简单。如果您决定连接到IsChecked事件,您将需要额外的代码来确定哪个属性与哪个复选框相关联。
最糟糕的情况是您需要为每个属性编写一个方法。
使用绑定一旦设置到复选框上,就完成了。您只需在最后保存对象即可。
为了存储IsChecked状态,我建议使用第一种方法(使用绑定),因为绑定可以使UI和代码更加清晰和解耦。 第二种方法(处理事件)最像WinForms的方法,所以我不明白您为什么要在WPF应用程序中使用它。
编辑:关于多个属性的问题的答案
这取决于实际绑定到视图的内容以及复选框在视图中的放置方式。
如果您正在使用一些类似于ListView
的ItemsControl
容器,并且每个复选框都属于单个行/列,则可以将所有复选框绑定到单个集合中。
private IList<bool> states;
public IList<bool> States
{
get
{
return this.states;
}
set
{
this.states = value;
this.OnPropertyChanged("States");
}
}