2012-04-10 28 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