WPF转换器 - 返回类类型的名称

时间:2011-03-20 02:47:31

标签: c# wpf data-binding converter

我在列表中有一个列表..这个列表的类型是“RequirementsBase”(一个抽象类)。

当我从父列表框中选择一个项目时,我想要做的是让列表框中的每个项目的Name属性显示在列表框中。 (希望这是有道理的)。如果没有转换器,当项目显示在列表框中时,我将获得该类的完整路径名称空间。一旦我挂上转换器,它就会显示列表的名称,而不是列表中的名称。它还在列表框中显示该名称,每个字母在其自己的行上。

这是我的XAML连接转换器:

<ListBox  Name="lstRequirements"
ItemsSource="{Binding ElementName=listTreasureCards,
              Path=SelectedItem.Requirements,
              Converter={StaticResource RequirementConverter}}"  />

以下是我的转换器的代码:

public object Convert(object value, Type targetType, object parameter,
                      System.Globalization.CultureInfo culture)
{
        return value.GetType().Name;
}

public object ConvertBack(object value, Type targetType, object parameter,
                          System.Globalization.CultureInfo culture)
{
    return value.GetType();
}

我是菜鸟,所以请说菜鸟。 :)

3 个答案:

答案 0 :(得分:4)

您的问题是您将转换器放在列表而不是列出元素。为了解决这个问题,您必须向项目模板添加内容(描述每个列表框项目如何显示的模板)并将转换器放在那里:

<ListBox Name="lstRequirements"
         ItemsSource="{Binding ElementName=listTreasureCards,
                               Path=SelectedItem.Requirements">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <ContentControl Content="{Binding Converter={StaticResource 
                                                        RequirementConverter}}"/>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

答案 1 :(得分:0)

我相信你所说的是你有一个IEnumerable&gt;作为listTreasureCards数据源。这将是RequirementsBase列表的列表。

我认为你想要的是每个对象名称的平面列表(IEnumerable),其中每个元素对应于列表列表的元素。

如果是这种情况,您应该尝试如下的LINQ表达式。

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
  var typedList = value as IEnumerable<IEnumerable<RequirementsBase>>;
  if (null == typedList) return null;

  return (from list in typedList
          from elem in list
          select elem.GetType().Name);
}

因为这是一个完全丢失的算法,所以实现ConvertBack没有什么意义;只是抛出NotImplementedException。

另外,另外,字母出现在不同行上的原因是ItemSource需要一个IEnumerable。你的convert方法返回一个String,恰好是一个IEnumerable(字母串)。因此,出于这个原因,每个字母都以不同的一行结束。

答案 2 :(得分:0)

实现目标的最简单最直接的方法是覆盖RequirementsBase.ToString

public override string ToString() {
    return this.GetType().Name;
}