.net 在XAML绑定中处理不同的内容
我在XAML中绑定到Validation.Errors。 有时这似乎是一个字符串,有时这是一个字符串列表 如果是单个字符串,则以下代码可以正常工作。 对于字符串列表,我只将“System.Generic.list”作为项控件中的项 如果我将DisplayMemberPath更改为“ErrorContent[0]”,如果它是一个列表,它将成功显示第一个字符串,但是如果它恰好是一个字符串,我当然只会获得第一个字符 问题。如何在XAML中处理这两种情况(单字符串类型和列表类型).net 在XAML绑定中处理不同的内容,.net,wpf,typescript,xaml,binding,.net,Wpf,Typescript,Xaml,Binding,我在XAML中绑定到Validation.Errors。 有时这似乎是一个字符串,有时这是一个字符串列表 如果是单个字符串,则以下代码可以正常工作。 对于字符串列表,我只将“System.Generic.list”作为项控件中的项 如果我将DisplayMemberPath更改为“ErrorContent[0]”,如果它是一个列表,它将成功显示第一个字符串,但是如果它恰好是一个字符串,我当然只会获得第一个字符 问题。如何在XAML中处理这两种情况(单字符串类型和列表类型) 首先,您需要为字符串和
首先,您需要为
字符串和列表定义两个数据模板
<DataTemplate x:Key="singleObject">
<TextBlock Text="{Binding}"/>
</DataTemplate>
<DataTemplate x:Key="collection">
<Listbox ItemsSource="{Binding}"/>
</DataTemplate>
最后,将DataTemplateSelector
设置为ItemsControl
<ItemsControl x:Name="ErrorDisplay" FontSize="12"
ItemsSource="{TemplateBinding Validation.Errors}"
DisplayMemberPath="ErrorContent" Foreground="Red"
ItemTemplateSelector="{StaticResource myDataTemplateSelector}"/>
是否可以重新实现验证。错误以返回可预测的类型?如果没有,您可能需要一个类型转换器:谢谢,我研究了一个转换器,但是使用下面Alex.Wei推荐的DataTemplate选择器更容易。谢谢,它工作得很好。Validation.Errors的类型是ValidationError,而不是String/List,但是更改您的答案来解决这个问题是很容易的。items控件未同时接受ItemTemplateSelector和DisplayMemberPath。我刚刚从ItemsControl中删除了DisplaymemberPath,让DataTemplates绑定到ErrorContent。在我的例子中,我实现了Validation.Errors类型为ValidationError,因此我必须更改选择器类以查看项目的ErrorContent属性。
public class MyDataTemplateSelector : DataTemplateSelector
{
public override DataTemplate
SelectTemplate(object item, DependencyObject container)
{
FrameworkElement element = container as FrameworkElement;
if (element != null && item != null)
{
var ie = item as IEnumerable;
if (ie == null)
return
element.FindResource("singleObject") as DataTemplate;
else
return
element.FindResource("collection") as DataTemplate;
}
return null;
}
}
<right namespace prefix:MyDataTemplateSelector x:Key="myDataTemplateSelector"/>
<ItemsControl x:Name="ErrorDisplay" FontSize="12"
ItemsSource="{TemplateBinding Validation.Errors}"
DisplayMemberPath="ErrorContent" Foreground="Red"
ItemTemplateSelector="{StaticResource myDataTemplateSelector}"/>