IValueConverter为通用对象命名,或者为字符串命名为字符串

时间:2019-05-02 14:10:20

标签: c# wpf xaml data-binding

我有一个名为{strong> ListBoxView 的ListBox,其中包含对象的集合。 ListBox链接到CollectionViewSource,用于过滤来自User的键入的输入。

我想在ListBox中显示对象的 Name 属性,当它是通用对象列表时,并且在ListBox包含字符串列表时,我希望将它们显示为字符串。所以我用IValueConverter来做到这一点。但是我没有使用它。

以下是我尝试过的代码:

  

WPF

<ListBox Grid.Row="2"
         Name="BoxList"
         FontFamily="Lucida Sans"
         FontWeight="Light"
         FontSize="13"
         Margin="5"
         HorizontalContentAlignment="Left"
         VerticalContentAlignment="Center"
         SelectionChanged="BoxList_SelectionChanged"
         SelectionMode="Extended">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <ContentPresenter Content = "{Binding ElementName=BoxList,
                                          Path=ItemsSource,
                                          Converter={StaticResource PropertyValuNameConverter},
                                          ConverterParameter=Name}"/>
        </DataTemplate>
    </ListBox.ItemTemplate>
    <ListBox.ItemContainerStyle>
        <Style TargetType="ListBoxItem">
            <Setter Property="Height" Value="30"/>
        </Style>
    </ListBox.ItemContainerStyle>
</ListBox>
  

C#

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
    var name = string.Empty;
    //Check if the value is a collection and proceed
    if (value.GetType().Name == typeof(List<>).Name)
    {
        foreach (var item in (IList)value)
        {
            if (item.GetType() != typeof(string))
            {
                var prop = item.GetType().GetProperty("Name");
                var val = prop.GetValue(value, null);
                name = val.ToString();
            }
            else
                name = item.ToString();
        }

        return name;
    }

    return "Not Converted";
}

ListBox将显示具有相同名称的所有内容,在此示例中,我的列表包含{a,b,c,d,e,f,j,k},但它将als显示为k

enter image description here

经过多次尝试和大量在线搜索,我无法弄清楚哪里出了问题。我不是程序员,请帮助我了解如何解决此问题或在哪里可以寻求帮助。谢谢

1 个答案:

答案 0 :(得分:1)

由于您要遍历所有项,因此转换器将始终返回最后一项的ToString()表示形式。

您可以绑定到当前项目并检查该项目的类型,而不是绑定到ItemsSource

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
    var currentItem = value;
    var name = "Not Converted";

    if (currentItem.GetType() != typeof(string))
    {
        var prop = currentItem.GetType().GetProperty("Name");
        var val = prop.GetValue(currentItem, null);
        name = val.ToString();
    }
    else
        name = currentItem.ToString();

    return name;
}

XAML:

<ContentPresenter Content = "{Binding Path=.,
    Converter={StaticResource PropertyValuNameConverter},
    ConverterParameter=Name}"/>