【问题标题】:Checkboxes binding - what is better solution?复选框绑定 - 什么是更好的解决方案?
【发布时间】:2011-11-22 22:38:15
【问题描述】:

我的 wpf 表单中有 20 多个复选框。我需要将所有 IsChecked 值存储在某个对象中。

我知道两种方法。

1) 使用 here 之类的依赖属性将所有复选框绑定到对象中的相应属性

2) 处理所有Clicked事件

哪种解决方案更好?有没有更好的解决方案在代码隐藏中占用更少的空间?

【问题讨论】:

    标签: c# wpf events data-binding checkbox


    【解决方案1】:

    一定要使用绑定

    如果您的 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; }
    }
    

    【讨论】:

    • +1 - 虽然我更喜欢使用 IsSelected; IsChecked 意味着该对象将始终绑定到一个复选框(或类似的)。
    【解决方案2】:

    绑定。

    原因很简单。如果您决定连接 IsChecked 事件,则必须有额外的代码来确定哪个属性与哪个复选框。

    更糟糕的情况是每个都有一个方法。

    一旦您将绑定设置为复选框,您就完成了。您所要做的就是在最后保存对象。

    【讨论】:

    • 仍然,代码隐藏中将有大约 20 个依赖属性,对吧?每个复选框一个属性。
    • @Andrew 是的,尽管如果您的复选框都在同一个区域中,您可以创建一个包含 DescriptionIsChecked 的对象列表,并将它们绑定到 ItemsControl。跨度>
    • 但是你真的不需要处理依赖属性。您可能会遇到这样一种情况,即对所有 20 个单击事件使用相同的单击事件,然后更新对象数组,但您仍然需要逻辑来确定哪个复选框调用了该事件。但是如果你有一个对象数组,你可能已经在使用 ListBox 之类的对象了。
    • @Andrew 发表评论太长了,所以我把它放在自己的答案中
    【解决方案3】:

    如果您使用好的 MVVM 框架,您可以使用绑定,而无需手动操作(仅按照某种约定命名) - 我喜欢 Caliburn Micro,但那里有很多好的。

    【讨论】:

      【解决方案4】:

      要存储 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 布局。

      【讨论】:

      • 是的,请尝试更好地解释它,我的英语不够好。哪个数字更好?
      • @Andrew :查看更新的答案,基本上是第一个 - 1,第二个 - 2 :)。从我的角度来看,绑定更好地存储值
      • 它是 2 列 20 行的网格。两列中每个单元格大约有 25 个复选框。在复选框的上方、中间和下方还有一些其他组件。你能想象吗?
      猜你喜欢
      • 2013-07-21
      • 2022-06-28
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-10
      相关资源
      最近更新 更多