我在ViewModel的Observable集合中有一个参数列表,希望将它们显示为取决于数据类型的文本框或组合框,但是我正在努力寻找一种方法来实现XAML中的任何类型的条件功能。
因此,假设我有一个可观察到的参数集合(标题,数据类型,值):
有效,布尔值
名称,字符串
年龄,UInt
我目前正在使用这些工具在窗口中生成一系列文本框,这些标签旁边的标签用于指示类型和参数名称,
<ItemsControl ItemsSource="{Binding Parameters}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Textbox Text="{Binding Value}"
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
但是我不想每次都将其作为文本框;如果数据类型有助于像True / False这样的预定义响应,那么我希望能够使用类似“ if”或“ switch”的组合框来代替组合框。
我见过类似的帖子,其中的答案似乎暗示建议使用Triggers
或DataTriggers
来完成此操作,这看起来完全符合我的需求。但是,他们似乎总是将其与Style
一起放在Style.Triggers
中,而不是我当前拥有的任何元素中。由于我们使用的内容略有差异,因此任何尝试复制我所看到的内容的尝试均以失败告终。该示例将使用类似ContentControl的样式,并将样式与“ Content = {…}”绑定,这是我无法做到的,因为“ Content”不是我可以应用于“ ItemControl”的东西,但是由于它的方式,我需要ItemControl实施ObservableCollection
而不采用内容控件的方式。
有没有简单的方法可以将“如果数据类型==布尔值,在此处创建一个组合框”之类的东西?如果我可以在ViewModel中做到这一点,我也很乐意。不想在后面的代码中做任何事情,因为MVVM似乎不能很好地发挥作用,并且在以后尝试混合它们时总是将我咬在后面,而我却无法值以正确交互。
非常感谢您的帮助。 我意识到我可以让用户TYPE为true / false并在viewmodel中将其解释为Boolean,但是有几种原因在我的情况下这将无法正常工作。一方面,会有很多选择。
答案 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>
您也可以使用自己的类型,它将自动检测并使用其数据类型。