【发布时间】:2016-11-26 13:10:06
【问题描述】:
我正在使用DataTrigger 取消选择ComboBox 和CheckBox(未选中== 取消选择)。
我需要的是:
- 当我从 ComboBox 中选择一些项目时,CheckBox 需要变为 已检查。
- 当我取消选中 CheckBox 时,ComboBox 需要取消选择。
- 如果取消选择 ComboBox,则无法检查 CheckBox(或者如果在 CheckBox 被选中后取消选择 ComboBox,则应使用第一项选择 ComboBox)
这是 XAML(这是工作版本,需要更改)。解决方案必须是纯 XAML(无 C# 代码)!
<CheckBox HorizontalContentAlignment="Stretch" VerticalContentAlignment="Center" Margin="90,519,13,0" VerticalAlignment="Top" Height="21" Width="Auto">
<CheckBox.Style>
<Style TargetType="{x:Type CheckBox}" BasedOn="{StaticResource {x:Type CheckBox}}">
<Style.Resources>
<Style TargetType="Path">
<Setter Property="FlowDirection" Value="LeftToRight" />
</Style>
<Style TargetType="TextBlock">
<Setter Property="FlowDirection" Value="LeftToRight" />
</Style>
</Style.Resources>
<Setter Property="FlowDirection" Value="RightToLeft" />
<!--<Setter Property="IsChecked" Value="True" />
<Style.Triggers>
<DataTrigger Binding="{Binding SelectedItem, ElementName=comboBoxEventDevice, UpdateSourceTrigger=PropertyChanged}" Value="{x:Null}">
<Setter Property="IsChecked" Value="False" />
</DataTrigger>
</Style.Triggers>-->
</Style>
</CheckBox.Style>
<ComboBox x:Name="comboBoxEventDevice" FlowDirection="LeftToRight" SelectionChanged="comboBoxEventDevice_SelectionChanged" Width="Auto">
<ComboBox.Style>
<Style TargetType="{x:Type ComboBox}" BasedOn="{StaticResource {x:Type ComboBox}}">
<Setter Property="SelectedIndex" Value="1" />
<Style.Triggers>
<DataTrigger Binding="{Binding Path=IsChecked, RelativeSource={RelativeSource AncestorType={x:Type CheckBox}}}" Value="True">
<Setter Property="SelectedIndex" Value="0" />
</DataTrigger>
<!--<DataTrigger Binding="{Binding Path=IsChecked, RelativeSource={RelativeSource AncestorType={x:Type CheckBox}}}" Value="False">
<Setter Property="SelectedIndex" Value="1" />
</DataTrigger>-->
</Style.Triggers>
</Style>
</ComboBox.Style>
</ComboBox>
</CheckBox>
更新:
我尽量不使用嵌套控件(复选框内的组合框),所以我更改了 XAML,但一切都和以前一样:
<CheckBox x:Name="checkBoxEventDevice" Margin="70,600,13,0" VerticalAlignment="Top" Height="21"/>
<ComboBox x:Name="comboBoxEventDevice" Margin="90,519,10,0" VerticalAlignment="Top" SelectionChanged="comboBoxEventDevice_SelectionChanged">
<ComboBox.Style>
<Style TargetType="{x:Type ComboBox}" BasedOn="{StaticResource {x:Type ComboBox}}">
<Setter Property="SelectedIndex" Value="1" />
<Style.Triggers>
<!--<DataTrigger Binding="{Binding Path=IsChecked, ElementName=checkBoxEventDevice}" Value="True">
<Setter Property="SelectedIndex" Value="0" />
</DataTrigger>-->
<DataTrigger Binding="{Binding Path=IsChecked, ElementName=checkBoxEventDevice}" Value="false">
<Setter Property="SelectedIndex" Value="-1" />
</DataTrigger>
</Style.Triggers>
</Style>
</ComboBox.Style>
</ComboBox>
问题出在<Setter Property="SelectedIndex" Value="1" /> 行。如果我删除它,那么当 datatrigger 关闭时取消选择 ComboBox,但如果我保留它,则当 datatrigger 关闭时,组合框设置为第二项。所以我需要一些我可以告诉的行:什么都不做,不要取消选择组合框,保持当前状态。
【问题讨论】:
-
避免代码有什么特别的原因吗?在 ViewModel 中,解决方案将无限简单(更不用说可单元测试了)。
-
我想要干净的 XAML,因为我想为未来制作通用的“复制粘贴”解决方案。所以你认为这是可能的。例如,我有问题:如果我将复选框未选中状态设置为取消选择组合框,一切正常,但每次我选中复选框时,它都会取消选择组合框。不知何故,当数据触发器的条件为真时,数据触发器工作正常,但当为假时,组合框始终设置为取消选择状态(假设它是组合框的默认初始状态)。如果条件为假,我需要在样式触发器中说些什么,不要做任何事情,保持当前状态不变。
-
是不是有什么特殊原因,你把combobox放在了checkbox里面?
ControlTemplate在这里会更有意义 -
我只是想让 ComboBox 为空,这样我就可以用 CheckBox 取消选择它(我不想为此使用 MVVM 模板,对于这个项目来说已经太晚了)。但我认为如果我将组合框移到复选框之外,问题将不会得到解决。有什么不同。但我现在会试着看看会发生什么,我会在这里写我的帖子作为评论。
-
一个可重用的解决方案是一个 UserControl,它封装了你想要实现的功能,你可以把它背后的逻辑放到 ViewModel 中。仅仅因为 MVVM 没有在您的项目中的其他地方使用并不意味着它不是解决问题的最佳方案。
标签: wpf xaml checkbox combobox datatrigger