IValueConverter для имени для универсальных объектов или строки для строк - PullRequest
0 голосов
/ 02 мая 2019

У меня есть ListBox с именем ListBoxView , который содержит коллекцию объектов.ListBox связан с CollectionViewSource для фильтрации вводимых данных от пользователя.

Я хотел бы показать свойство Name объекта в ListBox, когда это список родовыхобъект, и когда 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}, но показывает k.

enter image description here

После многих попыток и многих поисков в Интернете я не мог понять, в чем дело.Я не программист, пожалуйста, помогите мне понять, как решить эту проблему или куда я мог бы обратиться за помощью.Спасибо

1 Ответ

1 голос
/ 02 мая 2019

Поскольку вы перебираете все элементы, ваш конвертер всегда возвращает представление 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}"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...