我正在尝试通过复选框上的触发器切换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中,因为我需要将这种绑定开关应用于我的应用程序中的多个组合框/复选框对。
我遇到的问题是,当我输入上面的代码时,我的应用程序在启动时崩溃了!我已将它隔离到上面的触发器代码(删除它可以消除崩溃)。任何帮助表示赞赏!
答案 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");
}
}