WPF交换机绑定触发器

时间:2014-06-24 21:14:20

标签: c# wpf binding

我正在尝试通过复选框上的触发器切换ComboBox上的ItemsSource属性。这是我的代码:

<CheckBox Content="Test" VerticalAlignment="Center" Margin="5,0,0,0">
  <CheckBox.Triggers>
    <Trigger Property="CheckBox.IsChecked" Value="True">
      <Setter TargetName="MyComboBox" Property="ComboBox.ItemsSource" Value="{Binding A}" />
    </Trigger>
    <Trigger Property="CheckBox.IsChecked" Value="False">
      <Setter TargetName="MyComboBox" Property="ComboBox.ItemsSource" Value="{Binding B}" />
    </Trigger>
  </CheckBox.Triggers>
</CheckBox>

如您所见,预期目的是根据复选框的IsChecked状态在绑定“A”和绑定“B”之间切换。我见过很多人把这些触发器放在一个Style中,但这摆脱了我想要保留的窗口主题。另外,我希望这只是在XAML中,因为我需要将这种绑定开关应用于我的应用程序中的多个组合框/复选框对。

我遇到的问题是,当我输入上面的代码时,我的应用程序在启动时崩溃了!我已将它隔离到上面的触发器代码(删除它可以消除崩溃)。任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:2)

我猜测MyComboBox中没有CheckBox,因此超出了定义Trigger的命名范围。

不是将触发器添加到CheckBox,为什么不将它添加到ComboBox并将CheckBox.IsChecked属性绑定到视图模型中的属性,如下所示:

<CheckBox IsChecked="{Binding ShowComboBoxItemsA}"/>
<ComboBox ItemsSource="{Binding A}">
    <ComboBox.Triggers>
        <DataTrigger Binding="{Binding ShowAComboBoxItems}" Value="False">
            <Setter Property="ItemsSource" Value="{Binding B}"/>
        </DataTrigger>
    </ComboBox.Triggers>
</ComboBox>

另一个选项是将CheckBox.IsChecked属性绑定到视图模型中的属性,如第一个,但随后在setter中更新ComboBoxItems的值。

<CheckBox IsChecked="{Binding ShowComboBoxItemsA}"/>
<ComboBox ItemsSource="{Binding ComboBoxItems}"/> 

    public List<object> ItemsA { get; set; }
    public List<object> ItemsB { get; set; }

    bool showComboBoxItemsA;
    public bool ShowComboBoxItemsA
    {
        get { return showComboBoxItemsA; }
        set
        {
            if (showComboBoxItemsA != value)
            {
                showComboBoxItemsA = value;
                OnPropertyChanged("ShowComboBoxItemsA");

                if (showComboBoxItemsA)
                    ComboBoxItems = ItemsA;
                else
                    ComboBoxItems = ItemsB;
            }
        }
    }

    List<object> comboBoxItems;
    public List<object> ComboBoxItems
    {
        get { return comboBoxItems; }
        set
        {
            comboBoxItems = value;
            OnPropertyChanged("ComboBoxItems");
        }
    }