[英]How do I deserialize XML that has 2 elements with the same name but the elements have different datatypes?
[英]How do I create a group of different UI elements in XAML based on datatypes of the bound values?
我在ViewModel的Observable集合中有一个参数列表,希望根据数据类型显示为文本框或组合框,但是我正在努力寻找一种在XAML中实现任何类型的条件功能的方法。
因此,假设我有一个可观察到的参数集合(标题,数据类型,值):
有效,布尔值,
名称,字符串,
年龄,UInt,
我目前使用这些在窗口旁边的标签中生成一系列文本框,以指示类型和参数名称:
<ItemsControl ItemsSource="{Binding Parameters}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Textbox Text="{Binding Value}"
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
但是我不希望每次都成为一个文本框。 我希望能够有一个类似“如果”或“开关”的东西来制作一个组合框,如果数据类型有助于像True / False这样的预定义响应。
我见过类似的帖子,答案似乎暗示建议使用Triggers
或DataTriggers
来执行此操作,这看起来完全符合我的需求。 但是,他们似乎总是使用Style.Triggers
将其放在Style
,而不是我当前拥有的任何元素中。 由于我们使用的内容略有差异,因此任何尝试复制我所看到的内容的尝试均以失败告终。 该示例将使用类似ContentControl的样式,并将样式与“ Content = {…}”绑定,这是我不能做的,因为“ Content”不是我可以应用于“ ItemControl”的东西,但是由于它的方式,我需要ItemControl以Content控件无法实现的方式实现ObservableCollection
。
有没有简单的方法可以将“如果数据类型==布尔值,在此处创建一个组合框”之类的东西? 如果我可以在ViewModel中做到这一点,我也很乐意。 不想在后面的代码中做任何事情,因为MVVM似乎不能很好地发挥作用,并且在以后尝试混合它们时总是将我咬在后面,而我却无法值以正确交互。
非常感谢您的帮助。 我意识到我可以让用户TYPE为true / false并在viewmodel中将其解释为Boolean,但是有几种原因在我的情况下这将无法正常工作。 一方面,会有很多选择。
真的认为您应该使用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>
您也可以使用自己的类型,它将自动检测和使用数据类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.