你如何有条件地绑定数据?

时间:2010-10-26 21:27:32

标签: c# wpf conditional-binding

如何有条件地将数据绑定到组合框?我有一个组合框,默认情况下应该显示一个ID。但是,如果用户选中复选框,则显示屏应显示ID和NAME。例如,“OO1:Sam”。我正确显示默认ID。我只是不确定如何根据复选框的“IsChecked”状态显示ID和NAME。

WPF和C#.Net 3.5

2 个答案:

答案 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。

好处:通过这种方式,您可以为此行为编写单元测试。 (如果它值得投入,那么值得编写单元测试。)