Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 复选框绑定-什么是更好的解决方案?_C#_Wpf_Events_Data Binding_Checkbox - Fatal编程技术网

C# 复选框绑定-什么是更好的解决方案?

C# 复选框绑定-什么是更好的解决方案?,c#,wpf,events,data-binding,checkbox,C#,Wpf,Events,Data Binding,Checkbox,我的wpf表格中有20多个复选框。我需要在某个对象中存储IsChecked所有值 我知道两种方法 1) 使用依赖项属性将所有复选框绑定到对象中的相应属性,如 2) 处理所有这些事件的单击事件 哪种解决方案更好?是否有更好的解决方案占用更少的代码隐藏空间?要存储IsChecked状态,我建议遵循第一个解决方案(使用绑定),它更好,因为绑定允许保持UI和代码隐藏更干净、更解耦。 第二种方法(处理事件)最像WinForms方法,所以我不明白为什么您应该在WPF应用程序中遵循它 编辑:回答有关多个属性的

我的wpf表格中有20多个复选框。我需要在某个对象中存储
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; }
}