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

6

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

我知道两种方法。

1) 使用依赖属性将所有复选框绑定到对象中的相应属性,就像这里一样。

2) 处理它们全部的Clicked事件。

哪种解决方案更好?是否有更好的解决方案可以占用更少的代码空间?

4个回答

3

一定要使用绑定

如果你的复选框是不相关的,分散在各处,那么你需要在你的DataContext或ViewModel中绑定20个不同的依赖属性。

如果你的复选框都在一起,比如一个接一个地列出来或者在一个网格中,你可以把它们放在一个集合中,并将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意味着对象将始终绑定到复选框(或类似控件)。 - Metro Smurf

2

绑定。

原因很简单。如果您决定连接到IsChecked事件,您将需要额外的代码来确定哪个属性与哪个复选框相关联。

最糟糕的情况是您需要为每个属性编写一个方法。

使用绑定一旦设置到复选框上,就完成了。您只需在最后保存对象即可。


仍然会有大约20个依赖属性在代码后台,对吧?每个复选框一个属性。 - Ondrej Janacek
@Andrew 是的,虽然如果您的复选框都在同一区域,您可以创建一个包含“描述”和“是否选中”的对象列表,并将它们绑定到“ItemsControl”。 - Rachel
但你实际上不需要处理依赖属性。你可能会遇到这样的情况,即您对所有20个使用相同的单击事件,然后更新对象数组,但仍需要逻辑来确定哪个复选框调用了该事件。但是,如果您有一个对象数组,那么您可能已经在使用像ListBox这样的东西来处理对象了。 - paparazzo
@Andrew 评论里放不下,所以我单独回答了。 - Rachel

2

如果您使用一个好的MVVM框架,您可以使用绑定而无需手动完成(只需将它们命名为某些约定)-我喜欢Caliburn Micro,但市场上还有很多其他好的框架。


1

为了存储IsChecked状态,我建议使用第一种方法(使用绑定),因为绑定可以使UI和代码更加清晰和解耦。 第二种方法(处理事件)最像WinForms的方法,所以我不明白您为什么要在WPF应用程序中使用它。

编辑:关于多个属性的问题的答案

这取决于实际绑定到视图的内容以及复选框在视图中的放置方式。 如果您正在使用一些类似于ListViewItemsControl容器,并且每个复选框都属于单个行/列,则可以将所有复选框绑定到单个集合中。

private IList<bool> states;
public IList<bool> States
{
   get 
   {
      return this.states;
   }

   set
   {
      this.states = value;
      this.OnPropertyChanged("States");
   }
}

为了给您一个具体的答案,请分享复选框放置在哪个表单的UI布局。

耶,可以試著解釋得更好嗎?我的英語不夠好。哪個數字更好? - Ondrej Janacek
@Andrew:请查看更新后的答案,基本上第一个是1,第二个是2 : )。从我的角度来看,绑定更好,只需存储值即可。 - sll
这是一个有2列和20行的网格。每个单元格中都有大约25个复选框,分别位于两列中。除了复选框之外,还有一些其他组件在复选框上方、中间和下方。你能想象吗? - Ondrej Janacek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接