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中,因为我需要将这种绑定开关应用于我的应用程序中的多个组合框/复选框对。
我遇到的问题是,当我放入上述代码时,我的应用程序在启动时崩溃!我已经将它与上面的触发器代码隔离(删除它可以消除崩溃)。任何帮助都是感激的!
我猜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");
}
}