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

时间:2011-09-22 15:08:39

标签: c# wpf events data-binding checkbox

我的wpf格式中有20多个复选框。我需要在某个对象中存储来自所有这些值的IsChecked值。

我知道两种方式。

1)使用依赖属性(如here

)将所有复选框绑定到对象中的相应属性

2)处理所有这些事件的Clicked事件

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

4 个答案:

答案 0 :(得分:3)

绝对使用绑定

如果您的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 :(得分:2)

结合

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

更糟糕的是,你有一个方法。

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

答案 2 :(得分:2)

如果您使用一个好的MVVM框架,您可以使用绑定而无需手动执行(仅将它们命名为某些约定) - 我喜欢Caliburn Micro但是那里有很多好的。

答案 3 :(得分:1)

要存储IsChecked状态我建议遵循第一个(using binding),它更好,因为绑定允许保持UI和代码更加干净和分离。 第二个(handling an event)最像WinForms方法,所以我不明白为什么你应该在WPF应用程序中遵循它。

编辑:回答有关多个属性的问题

如果取决于实际绑定到View的内容以及如何在View中放置复选框。 如果您使用ItemsControl之类的ListView容器,并且每个复选框属于单行/列 - 您可以将所有复选框绑定到单个集合,例如

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

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

为了给你一个具体的答案 - 请分享表格的UI布局,其中放置了复选框。