Как использовать IMultiValueConverter для поиска данных из связанной таблицы - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть DataGridTemplateColumn в DataGrid, который выглядит следующим образом:

<DataGridTemplateColumn Width="3*" Header="Item">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding AssetDescriptionID} Converter={StaticResource converter}" />
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
    <DataGridTemplateColumn.CellEditingTemplate>
        <DataTemplate>
            <ComboBox
                DisplayMemberPath="Description"
                ItemsSource="{Binding Data.AssetDescriptions, Source={StaticResource proxy}}"
                SelectedValue="{Binding AssetDescriptionID}"
                SelectedValuePath="AssetDescriptionID" />
        </DataTemplate>
    </DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>

Я хотел бы использовать многозначный преобразователь для поиска описания актива из другой таблицы по идентификатору описания актива, в этом(вероятно, неправильно) строка:

<TextBlock Text="{Binding AssetDescriptionID} Converter={StaticResource converter}" />

У ViewModel есть открытое свойство, содержащее описания активов:

public IEnumerable<AssetDescription> AssetDescriptions { get; set; }

Где AssetDescription по существу:

public class AssetDescription
{
    public int AssetDescriptionID { get; set; }
    public string Description { get; set; }
}

ИтакЯ написал этот класс конвертера:

public class AssetDescriptionConverter : FrameworkElement, IMultiValueConverter
{
    public IEnumerable<T_AssetDescription> AssetDescriptions
    {
        get { return (IEnumerable<T_AssetDescription>)GetValue(AssetDescriptionsProperty); }
        set { SetValue(AssetDescriptionsProperty, value); }
    }

    public static readonly DependencyProperty AssetDescriptionsProperty =
        DependencyProperty.Register("AssetDescriptions", typeof(IEnumerable<T_AssetDescription>), typeof(AssetDescriptionConverter));

    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        var items = values as IEnumerable<T_Asset>;
        if (items != null)
        var item = items.FirstOrDefault(x => x.AssetDescriptionID == (int)parameter);
        return item == null ? string.Empty : item.Description;
    }

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

Но я не могу понять, как объявить этот ресурс в XAML, а затем связать его с моим TextBlock.

1 Ответ

0 голосов
/ 30 ноября 2018

В части ресурса:

<AssetDescriptionConverter x:Key="AssetDescriptionConverter"/>

, а затем в xaml:

<TextBlock Text="{Binding AssetDescriptionID, Converter={StaticResource AssetDescriptionConverter}}"/>
...