【发布时间】:2011-11-22 22:38:15
【问题描述】:
我的 wpf 表单中有 20 多个复选框。我需要将所有 IsChecked 值存储在某个对象中。
我知道两种方法。
1) 使用 here 之类的依赖属性将所有复选框绑定到对象中的相应属性
2) 处理所有Clicked事件
哪种解决方案更好?有没有更好的解决方案在代码隐藏中占用更少的空间?
【问题讨论】:
标签: c# wpf events data-binding checkbox
我的 wpf 表单中有 20 多个复选框。我需要将所有 IsChecked 值存储在某个对象中。
我知道两种方法。
1) 使用 here 之类的依赖属性将所有复选框绑定到对象中的相应属性
2) 处理所有Clicked事件
哪种解决方案更好?有没有更好的解决方案在代码隐藏中占用更少的空间?
【问题讨论】:
标签: c# wpf events data-binding checkbox
一定要使用绑定
如果您的 CheckBox 不相关并且到处都是,则您需要在 DataContext 或 ViewModel 中绑定 20 个不同的依赖项属性
如果您的 CheckBox 都放在一起,例如一个接一个或在一个 Grid 中列出,您可以将它们放在一个集合中并绑定一个 ItemsControl 到它们
<ItemsControl ItemsSource="{Binding Options}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<CheckBox Content="{Binding Description}"
IsChecked="{Binding IsChecked}" />
</DataTemplate>
</ItemsControl>
</ItemsControl>
您的 ViewModel 或 DataContext 将包含如下内容:
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 事件,则必须有额外的代码来确定哪个属性与哪个复选框。
更糟糕的情况是每个都有一个方法。
一旦您将绑定设置为复选框,您就完成了。您所要做的就是在最后保存对象。
【讨论】:
Description 和 IsChecked 的对象列表,并将它们绑定到 ItemsControl。跨度>
如果您使用好的 MVVM 框架,您可以使用绑定,而无需手动操作(仅按照某种约定命名) - 我喜欢 Caliburn Micro,但那里有很多好的。
【讨论】:
要存储 IsChecked 状态 我建议遵循第一个 (using binding),因为绑定可以让 UI 和代码保持更干净和解耦。
第二个(handling an event)最像 WinForms 方法,所以我不明白为什么你应该在 WPF 应用程序中遵循它。
编辑:回答有关多个属性的问题
是否取决于实际绑定到视图的内容以及复选框在视图中的放置方式。
如果您使用一些 ItemsControl 容器,例如 ListView,并且每个复选框属于单行/列 - 您可以将所有复选框绑定到单个集合,例如
private IList<bool> states;
public IList<bool> States
{
get
{
return this.states;
}
set
{
this.states = value;
this.OnPropertyChanged("States");
}
}
为了给你一个具体的答案 - 请分享放置复选框的表单的 UI 布局。
【讨论】: