如何根据绑定值的数据类型在XAML中创建一组不同的UI元素?

时间:2019-07-17 15:42:36

标签: c# wpf xaml mvvm

我在ViewModel的Observable集合中有一个参数列表,希望将它们显示为取决于数据类型的文本框或组合框,但是我正在努力寻找一种方法来实现XAML中的任何类型的条件功能。

因此,假设我有一个可观察到的参数集合(标题,数据类型,值):

  

有效,布尔值

     

名称,字符串

     

年龄,UInt

我目前正在使用这些工具在窗口中生成一系列文本框,这些标签旁边的标签用于指示类型和参数名称,

<ItemsControl ItemsSource="{Binding Parameters}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Textbox Text="{Binding Value}"
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

但是我不想每次都将其作为文本框;如果数据类型有助于像True / False这样的预定义响应,那么我希望能够使用类似“ if”或“ switch”的组合框来代替组合框。

我见过类似的帖子,其中的答案似乎暗示建议使用TriggersDataTriggers来完成此操作,这看起来完全符合我的需求。但是,他们似乎总是将其与Style一起放在Style.Triggers中,而不是我当前拥有的任何元素中。由于我们使用的内容略有差异,因此任何尝试复制我所看到的内容的尝试均以失败告终。该示例将使用类似ContentControl的样式,并将样式与“ Content = {…}”绑定,这是我无法做到的,因为“ Content”不是我可以应用于“ ItemControl”的东西,但是由于它的方式,我需要ItemControl实施ObservableCollection而不采用内容控件的方式。

有没有简单的方法可以将“如果数据类型==布尔值,在此处创建一个组合框”之类的东西?如果我可以在ViewModel中做到这一点,我也很乐意。不想在后面的代码中做任何事情,因为MVVM似乎不能很好地发挥作用,并且在以后尝试混合它们时总是将我咬在后面,而我却无法值以正确交互。

非常感谢您的帮助。 我意识到我可以让用户TYPE为true / false并在viewmodel中将其解释为Boolean,但是有几种原因在我的情况下这将无法正常工作。一方面,会有很多选择。

1 个答案:

答案 0 :(得分:0)

真的认为您应该使用DataTemplates:

... xmlns:sys="clr-namespace:System;assembly=mscorlib"

<ItemsControl ItemsSource="{Binding Parameters}">
    <ItemsControl.Resources>
        <DataTemplate DataType="{x:Type sys:Boolean}">
            <Checkbox IsChecked="{Binding}" />
        </DataTemplate>
        <DataTemplate DataType="{x:Type sys:String}">
             <TextBlock Text="{Binding}" />
        </DataTemplate>
    </ItemsControl.Resources>
    <ItemsControl.ItemTemplate>
         <DataTemplate>
             <StackPanel Orientation="Horizontal">
                 <TextBlock Text="{Binding Title}" />
                 <ContentPresenter Content="{Binding Value}" />
             </StackPanel>
         </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

您也可以使用自己的类型,它将自动检测并使用其数据类型。