【问题标题】:WPF Converters - Returning the Name of a Class TypeWPF 转换器 - 返回类类型的名称
【发布时间】:2011-03-20 11:06:38
【问题描述】:

我在一个列表中有一个列表.. 这个列表的类型是“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();
}

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

【问题讨论】:

  • 从问题中不清楚您到底想显示什么。举个例子会有所帮助。
  • 我想显示列表中类类型的 Name 属性。所以如果我要这样做: List mylist (RequirementsBase 是一个抽象类,所以列表实际上包含性别、级别等项目)如果我做了 mylist[0].GetType().Name我会得到“性”。如何让它显示在我的列表框中而不是它的名称空间中 - 即 GameInfo.Requirements.Sex?

标签: c# wpf data-binding converter


【解决方案1】:

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

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

【讨论】:

  • 谢谢加布!这修复了它:)
【解决方案2】:

我相信你的意思是你有一个 IEnumerable> 作为你的 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 方法返回一个字符串,它恰好是一个 IEnumerable(字母字符串)。因此,出于这个原因,每个字母都以不同的行结束。

【讨论】:

  • 我曾试图实现你的方法,但每次运行它都返回 null。
  • 我认为如果您删除额外的 IEnumerable&lt;&gt;s 之一,这将起作用。
  • 我也试过了..它没有用。不过,我确实让它与其他人的解决方案一起使用。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-06
    • 1970-01-01
    • 2019-11-04
    • 2019-12-18
    相关资源
    最近更新 更多