2011-09-22 112 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,但是有很多好的東西。

相關問題