WPF开关绑定触发器

本文关键字:触发器 绑定 开关 WPF | 更新日期: 2023-09-27 18:10:04

我试图通过复选框上的触发器来切换组合框上的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"之间切换。我见过很多人把这些触发器放在样式中,但这样就去掉了我想保留的窗口主题。此外,我希望这只在XAML中,因为我需要将这种绑定开关应用于我的应用程序中的多个组合框/复选框对。

我遇到的问题是,当我放入上述代码时,我的应用程序在启动时崩溃!我已经将它与上面的触发器代码隔离(删除它可以消除崩溃)。任何帮助都是感激的!

WPF开关绑定触发器

我猜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");
        }
    }