Как получить список <T>в конвертере класса wpf - PullRequest
0 голосов
/ 26 мая 2020

Я хочу использовать конвертер, но не знаю, как получить список конвертеров на стороне класса.

В моей модели ViewModel у меня есть две ObservableCollections, коллекция Customers для привязки моего элемента DataGrid исходники и коллекция секторов для привязки конвертера.

public ObservableCollection<Custormer> Customers = new ObservableCollection<Customer>();

public ObservableCollection<Sector> Sectors = new ObservableCollection<Sector>();

Мой код XAMl выглядит так

<DataGrid ItemsSource="Binding Customers" .... >
   <DataGridTextColumn Header="Name">
      <DataGridTextColumn.Binding>
         <MultiBinding Converter="{StaticResource ConverterNameHere}">
            <Binding Path="Name" />
            <Binding Path="Sectors" />
         </MultiBinding>
      </DataGridTextColumn.Binding>
   .....
</DataGrid>

Мой конвертер:

public class ConverterNameHere: IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        string Name = values[0].ToString();

        /* This does not work ---------------------------- */

        ObservableCollection<Sector> SectorsList = new ObservableCollection<Sector>(values[1].ToList());

        /* ----------------------------------------------- */

        var found = SectorsList .FirstOrDefault(sector => sector.Name == Name);

        if(found == null)
        {
            return "Not Found";
        }
        return Name;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

Заранее спасибо

1 Ответ

0 голосов
/ 26 мая 2020

Использовать сопоставление с образцом is

public class ConverterNameHere : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        if (values[0] is string name && values[1] is ObservableCollection<Sector> sectors)
        {
            return sectors.Any(sector => sector.Name == name) ? name : "Not Found";
        }
        return null;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        return new object[] { value, null };
    }
}

Также вы можете исправить xaml, потому что Sectors находится в Window.DataContext, а не в элементе DataGrid, где находится Name. Binding.Path относительно DataContext.

<DataGrid ItemsSource="{Binding Customers}" .... >
   <DataGridTextColumn Header="Name">
      <DataGridTextColumn.Binding>
         <MultiBinding Converter="{StaticResource ConverterNameHere}">
            <Binding Path="Name" />
            <Binding Path="DataContext.Sectors" RelativeSource="{RelativeSource AncestorType=Window}" Mode="OneWay" />
         </MultiBinding>
      </DataGridTextColumn.Binding>
   .....
</DataGrid>

И не забудьте поставить конвертер на Resources

<Window.Resources>
    <local:ConverterNameHere x:Key="ConverterNameHere"/>
</Window.Resources>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...