【问题标题】:How do you conditionally bind data?如何有条件地绑定数据?
【发布时间】:2010-10-26 21:27:31
【问题描述】:

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

WPF 和 C# .Net 3.5

【问题讨论】:

  • 向客户端/或数组发送值列表。将项目附加到列表中,在将项目添加到下拉列表时对列表进行适当的字符串操作。

标签: c# wpf conditional-binding


【解决方案1】:

这是一种方法,使用带有触发器的 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}" />

【讨论】:

  • 马特,非常感谢!这正是我一直在寻找的。当然,我相信你可以告诉我是 WPF 的新手。我知道它必须比我的方式要容易得多。现在,有没有办法让它成为“StaticResource”,不确定这是否是正确的术语。您将如何在组合框定义中使用它?
  • 您是否打算在多个 ComboBox 中重用该样式,GAR8?如果您愿意,我可以编辑答案并将其更改为资源 - 这不是一个很大的变化。如果您没有在多个 ComboBox 中重复使用它,那么恕我直言,将其作为资源是不值得的。
  • 是的,Matt 有两个组合框将受此单个复选框状态以及 DataGrid 中包含的一些数据的影响。我还将在另一个复选框上使用相同的概念,这将影响三个组合框、文本框和同一 DataGrid 中的数据。因此,拥有资源来最小化和重用代码将非常有帮助。非常感谢您在这方面的帮助。 G
  • 马特,谢谢,这很酷。我让它通过 c# 事件等工作,但我更喜欢绑定,最后的代码更少。此外,我已经为组合框定义了 Style StaticResource,因此我能够将“BasedOn”添加到您的示例中并包含现有资源,然后在组合框中使用您的新资源。这很好,因为以前的资源仅适用于一般组合框的东西,对齐方式,背景,宽度......再次感谢。 G
【解决方案2】:

我会在 ViewModel 中这样做。您可以为您的组合框项目设置一个视图模型,为复选框所在的任何屏幕设置另一个视图模型,以及复选框视图模型在其值发生更改时告诉项目视图模型的某种方式。然后,项目视图模型在其 Text 属性(或您所称的任何内容)中具有条件逻辑,并实现通常的 INotifyPropertyChanged 模式以在其文本发生更改时通知 UI。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-05
    • 1970-01-01
    • 2019-01-13
    • 1970-01-01
    • 2022-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多