2011-09-22 67 views
6

我的wpf表单中有20多个复选框。我需要在某些对象中存储来自所有这些值的IsChecked值。复选框绑定 - 什么是更好的解决方案?

我知道两种方式。

1)结合所有复选框使用依赖属性等here

2)对应在对象属性处理Clicked事件个个

哪个溶液是较好的?是否有更好的解决方案在代码隐藏方面占用更少的空间?

回答

3

肯定使用绑定

如果你的复选框都无关,且所有的地方,就需要20个不同的依赖属性绑定到你的DataContext或视图模型

如果复选框被一起如陆续或在网格中列出的一个,你可以把它们收集并绑定一个ItemsControl他们

<ItemsControl ItemsSource="{Binding Options}"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <CheckBox Content="{Binding Description}" 
         IsChecked="{Binding IsChecked}" /> 
     </DataTemplate> 
    </ItemsControl> 
</ItemsControl> 

您的视图模型或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类,简直是

​​
+0

+1 - 虽然我更喜欢使用IsSelected; IsChecked意味着对象将始终绑定到复选框(或类似的)。 –

1

要存储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布局其中放置复选框的表单。

+0

耶,试图更好地解释它,请,我的英语不够好。哪一个更好? –

+0

@Andrew:看到更新的答案,基本上是第一个 - 1,第二 - 2 :)。从我的角度来看,绑定更好,只是为了存储价值 – sll

+0

像我发布到大卫Basarab答案一样的问题... –

2

绑定。

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

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

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

+0

不过,在代码隐藏中会有大约20个依赖属性,对吧?每个复选框有一个属性。 –

+0

@Andrew是的,但如果你的CheckBox都在同一个区域,你可以做一个包含'Description'和'IsChecked'的对象列表,并将它们绑定到'ItemsControl'。 – Rachel

+0

但是你并不需要处理依赖属性。你可能会遇到这样一种情况,即对所有20使用相同的单击事件,然后更新对象数组,但仍然需要逻辑来确定哪个复选框称为事件。但是如果你有一个对象数组,你可能会使用类似ListBox的对象。 – Paparazzi

2

如果你使用的是一个好的MVVM框架,你可以使用绑定而不必手动完成它们(只是将它们命名为某种约定) - 我喜欢Caliburn Micro,但是有很多好的东西。

相关问题