如何有条件地将数据绑定到组合框?我有一个组合框,默认情况下应该显示一个 ID。但是,如果用户选中一个复选框,那么显示器应该同时显示 ID 和 NAME。例如,“OO1:山姆”。我的默认 ID 显示正确。我只是不确定如何根据复选框的“IsChecked”状态同时显示 ID 和 NAME。
WPF 和 C# .Net 3.5
如何有条件地将数据绑定到组合框?我有一个组合框,默认情况下应该显示一个 ID。但是,如果用户选中一个复选框,那么显示器应该同时显示 ID 和 NAME。例如,“OO1:山姆”。我的默认 ID 显示正确。我只是不确定如何根据复选框的“IsChecked”状态同时显示 ID 和 NAME。
WPF 和 C# .Net 3.5
这是一种方法,在 ComboBox 上使用带有触发器的样式来动态设置 ItemTemplate:
编辑:将样式更改为资源。请注意,这仍然使用元素绑定直接绑定到 CheckBox - 如果您希望它更灵活,您可以将 CheckBox 的 IsChecked 属性绑定到 ViewModel 的属性并依赖于更改而不是 IsChecked。
让我们将样式移动到窗口的资源部分:
<Window.Resources>
<Style x:Key="myStyle" TargetType="ComboBox">
<Setter Property="ItemTemplate">
<Setter.Value>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Name}" />
</StackPanel>
</DataTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<DataTrigger Binding="{Binding IsChecked,ElementName=chk}" Value="True">
<Setter Property="ItemTemplate">
<Setter.Value>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding ID}" />
<TextBlock Text=": " />
<TextBlock Text="{Binding Name}" />
</StackPanel>
</DataTemplate>
</Setter.Value>
</Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</Window.Resources>
现在我们定义 CheckBox 和几个依赖它的 ComboBox:
<CheckBox x:Name="chk" Content="Click Me" />
<ComboBox ItemsSource="{Binding}" Style="{StaticResource myStyle}" />
<ComboBox ItemsSource="{Binding}" Style="{StaticResource myStyle}" />
我会在 ViewModel 中这样做。您可以为您的组合框项目设置一个视图模型,为复选框所在的任何屏幕设置另一个视图模型,以及复选框视图模型在其值发生更改时告诉项目视图模型的某种方式。然后,项目视图模型在其 Text 属性(或您所称的任何内容)中具有条件逻辑,并实现通常的 INotifyPropertyChanged 模式以在其文本发生更改时通知 UI。
好处:通过这种方式,您可以为此行为编写单元测试。(如果值得投入,那么值得为其编写单元测试。)