C# 复选框绑定-什么是更好的解决方案?
我的wpf表格中有20多个复选框。我需要在某个对象中存储C# 复选框绑定-什么是更好的解决方案?,c#,wpf,events,data-binding,checkbox,C#,Wpf,Events,Data Binding,Checkbox,我的wpf表格中有20多个复选框。我需要在某个对象中存储IsChecked所有值 我知道两种方法 1) 使用依赖项属性将所有复选框绑定到对象中的相应属性,如 2) 处理所有这些事件的单击事件 哪种解决方案更好?是否有更好的解决方案占用更少的代码隐藏空间?要存储IsChecked状态,我建议遵循第一个解决方案(使用绑定),它更好,因为绑定允许保持UI和代码隐藏更干净、更解耦。 第二种方法(处理事件)最像WinForms方法,所以我不明白为什么您应该在WPF应用程序中遵循它 编辑:回答有关多个属性的
IsChecked
所有值
我知道两种方法
1) 使用依赖项属性将所有复选框绑定到对象中的相应属性,如
2) 处理所有这些事件的单击事件
哪种解决方案更好?是否有更好的解决方案占用更少的代码隐藏空间?要存储IsChecked状态,我建议遵循第一个解决方案(使用绑定),它更好,因为绑定允许保持UI和代码隐藏更干净、更解耦。
第二种方法(处理事件
)最像WinForms方法,所以我不明白为什么您应该在WPF应用程序中遵循它
编辑:回答有关多个属性的问题
If取决于实际绑定到视图的内容以及复选框在视图中的放置方式。
如果您使用一些项控件
容器,如列表视图
,并且每个复选框都属于单个行/列,则可以将所有复选框绑定到单个集合,如
private IList<bool> states;
public IList<bool> States
{
get
{
return this.states;
}
set
{
this.states = value;
this.OnPropertyChanged("States");
}
}
私有IList国家;
公营国
{
得到
{
把这封信寄回美国;
}
设置
{
这个。状态=值;
本协议项下的不动产变更(“州”);
}
}
为了给你一个具体的答案,请分享表单的UI布局,其中有复选框。绑定
原因很简单。如果您决定连接到IsChecked事件,则必须有额外的代码来确定哪个属性对应于哪个复选框
更糟糕的情况是,每种方法都有对应的方法
一旦您将其设置为复选框,就可以使用绑定。你所要做的就是在最后保存对象。如果你使用一个好的MVVM框架,你可以使用绑定,而不必手工操作(只需按照一些惯例命名)——我喜欢,但有很多好的绑定。肯定要使用绑定
如果您的复选框是不相关的,并且到处都是,那么您需要在DataContext或ViewModel中绑定20个不同的依赖属性
如果您的复选框都在一起,例如一个接一个地列出或在网格中列出,则可以将它们放入集合中,并将ItemsControl
绑定到它们
<ItemsControl ItemsSource="{Binding Options}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<CheckBox Content="{Binding Description}"
IsChecked="{Binding IsChecked}" />
</DataTemplate>
</ItemsControl>
</ItemsControl>
是的,请尽量解释清楚,我的英语不够好。哪一个数字更好?@Andrew:看更新的答案,基本上是第一个1,第二个2:)。从我的观点来看,仅仅存储值绑定要好得多,它是一个2列20行的网格。两列中每个单元格都有大约25个复选框。在复选框的上面、中间和下面还有一些其他组件。你能想象吗?尽管如此,代码隐藏中仍然会有大约20个依赖属性,对吗?每个复选框有一个属性。@Andrew是的,但是如果您的复选框都在同一个区域,您可以列出包含说明和已选中的对象,并将它们绑定到项控件
。但您实际上不需要处理依赖项属性。在这种情况下,您可以对所有20个对象使用相同的单击事件,然后更新对象数组,但仍然需要逻辑来确定哪个复选框称为事件。但是如果你有一个对象数组,你可能已经在为对象使用类似列表框的东西了。@Andrew注释太长了,所以我把它放在它自己的答案+1中-尽管我更喜欢使用IsSelected;IsChecked意味着对象将始终绑定到复选框(或类似复选框)。
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;
}
}
public class Option
{
public string Description { get; set; }
public bool IsChecked { get; set; }
}