2012-04-10 70 views
0

我正在動態生成CheckBoxes,我想根據應該選擇哪些選項來檢查它們。如何動態檢查CheckBoxes?

我有以下XAML:

 <StackPanel> 
      <StackPanel x:Name="ArmingPanel" /> 
     </StackPanel> 

以下代碼:

private void AddCheckBoxes(OptionsVM options) 
    { 
     var converter = new FlagsEnumValueConverter(); 
     foreach (Arming arming in Enum.GetValues(typeof(Arming))) 
     { 
      if (arming != Arming.None) 
      { 

       var binding = new Binding() 
       { 
        Path = new PropertyPath("Arming"), 
        Converter = converter,       
        ConverterParameter = arming 
       }; 

       var checkBox = new CheckBox() 
            { 
             Content = arming.ToString(), 
             IsChecked = (options.Options.Arming & arming) != Arming.None 
            }; 

       checkBox.SetBinding(CheckBox.IsCheckedProperty, binding); 
       ArmingPanel.Children.Add(checkBox); 
      } 
     } 
    } 

根據該標誌已設置,應設置爲truefalse如下:

IsChecked = (options.Options.Arming & arming) != Arming.None 

我可以看到這個值被正確設置w如果我調試,但是當複選框在屏幕上列出時,它們總是未選中。

如何讓他們按預期檢查?

+1

ConverterParameter的'IsChecked'屬性由你的綁定設置。 – Matten 2012-04-10 11:02:50

+0

東西告訴我你的綁定被破壞。如果你想將它綁定到某個東西,你不應該手動設置你的IsChecked屬性。 – 2012-04-10 11:05:24

+0

正如Matten所說,在您將其設置爲代碼後,立即通過「綁定」設置「IsChecked」。如果它返回'Nullable Clemens 2012-04-10 11:15:58

回答

2

在打電話給你CheckBox構造函數時,你設置了IsChecked,它在複選框上設置了IsCheckedProperty。然後,您再次將IsCheckedProperty設置爲Binding,因此第一個設置將被覆蓋。

我懷疑你的問題出在Converter和綁定

-1

編輯:這不是OP的問題,但我覺得值得一提。

看來,你檢查枚舉標誌,正確的布爾表達式爲:

(options.Options.Arming & arming) == arming

如果這個表達式返回true,然後options.Options.Arming包含存儲在arming

它是標誌同樣重要的是你的enum Arming成員被正確定義!

+0

OP表示在調試模式下運行時,該值設置正確。但是他在手動設置數據綁定後會設置數據綁定,這會覆蓋之前設置的「正確」值。所以這個'enum Arming'成員被正確定義。 – 2012-04-10 11:11:10

+0

我們不能說'武裝'的定義或'武裝。無'的價值,我的「答案」應該是一個評論,但它太長了。而且我應該明確表示,我並沒有在這裏回答真正的問題。 – rfmodulator 2012-04-10 11:14:26

+0

對於投票,你更喜歡我只是刪除它?你不覺得這是對給出的示例代碼的重要批評嗎? – rfmodulator 2012-04-10 11:22:43