.net 在XAML绑定中处理不同的内容

.net 在XAML绑定中处理不同的内容,.net,wpf,typescript,xaml,binding,.net,Wpf,Typescript,Xaml,Binding,我在XAML中绑定到Validation.Errors。 有时这似乎是一个字符串,有时这是一个字符串列表 如果是单个字符串,则以下代码可以正常工作。 对于字符串列表,我只将“System.Generic.list”作为项控件中的项 如果我将DisplayMemberPath更改为“ErrorContent[0]”,如果它是一个列表,它将成功显示第一个字符串,但是如果它恰好是一个字符串,我当然只会获得第一个字符 问题。如何在XAML中处理这两种情况(单字符串类型和列表类型) 首先,您需要为字符串和

我在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}"/>