如何有条件地将数据绑定到组合框?我有一个组合框,默认情况下应该显示一个ID。但是,如果用户选中复选框,则显示屏应显示ID和NAME。例如,“OO1:Sam”。我正确显示默认ID。我只是不确定如何根据复选框的“IsChecked”状态显示ID和NAME。
WPF和C#.Net 3.5
答案 0 :(得分:3)
这是一种方法,使用ComboBox上的样式和触发器动态设置ItemTemplate:
编辑:将样式更改为资源。请注意,这仍然使用元素绑定直接绑定到CheckBox - 如果您希望它更灵活,可以将CheckBox的IsChecked属性绑定到ViewModel的属性,并依赖于更改而不是IsChecked。
让我们将样式移动到Window窗口的Resources部分:
<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}" />
答案 1 :(得分:1)
我会在ViewModel中这样做。你可以有一个用于组合框项目的视图模型,另一个用于复选框所在屏幕的视图模型,以及复选框视图模型在其值已更改时告诉项目视图模型的某种方式。然后,项目视图模型在其Text属性(或任何您调用它)中具有条件逻辑,并实现通常的INotifyPropertyChanged模式,以在其文本发生更改时通知UI。
好处:通过这种方式,您可以为此行为编写单元测试。 (如果它值得投入,那么值得编写单元测试。)