Конвертеры WPF - возвращение имени типа класса - PullRequest
2 голосов
/ 20 марта 2011

У меня есть список внутри списка .. и этот список имеет тип "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 ]

4 голосов
/ 20 марта 2011

Ваша проблема в том, что вы поместили конвертер в список вместо списка elements .Чтобы это исправить, вы должны добавить содержимое в шаблон элемента (шаблон, который описывает, как отображается каждый элемент списка) и поместить конвертер туда:

<ListBox Name="lstRequirements"
         ItemsSource="{Binding ElementName=listTreasureCards,
                               Path=SelectedItem.Requirements">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <ContentControl Content="{Binding Converter={StaticResource 
                                                        RequirementConverter}}"/>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>
0 голосов
/ 20 марта 2011

Самый простой и прямой способ достижения вашей цели - переопределить RequirementsBase.ToString:

public override string ToString() {
    return this.GetType().Name;
}
0 голосов
/ 20 марта 2011

Я полагаю, что вы говорите, что у вас есть 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 (строка букв). По этой причине каждая буква заканчивается отдельной строкой.

...