【问题标题】:How to use an IMultiValueConverter to look up data from a related table如何使用 IMultiValueConverter 从相关表中查找数据
【发布时间】:2018-11-30 15:58:27
【问题描述】:

我在 DataGrid 中有一个 DataGridTemplateColumn,如下所示:

<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>

我想使用多值转换器通过资产描述 ID 从另一个表中查找资产描述,在此(可能是错误的)行中:

<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。

【问题讨论】:

  • 使用&lt;MultiBinding&gt; 而不是简单的绑定。 MultiBinding 的一个绑定应提供 AssetDescriptionID,而 MultiBinding 中的另一个绑定应提供“其他”表数据。不过,我对您尝试将(多)值转换器作为 FrameworkElement 感到困惑。看起来你要么试图做一些棘手的、肮脏的事情;要么或者您可能误解了这些值转换器的用途以及绑定机制如何使用它们......
  • IMultiValueConverter 仅适用于 MultiBinding。这应该是一个 IValueConverter。 {Binding AssetDescriptionID} 不会将多个值传递给转换器,而只是将集合对象传递给 IValueConverter 的单个值。
  • @Clemens:我想的差不多。
  • 我不确定您链接到的评论应该告诉我什么。无论如何,如果由于(项目)数据模板或其他问题尝试在不同控件之间进行绑定变得过于复杂,您可能会考虑通过控件到控件绑定来移动您尝试解决的这种数据依赖关系的想法进入视图模型领域(基本上,不是尝试使用值转换器,而是为项目(?)使用专用的视图模型,然后进行数据转换/转换)。

标签: c# wpf data-binding wpfdatagrid imultivalueconverter


【解决方案1】:

在资源部分:

<AssetDescriptionConverter x:Key="AssetDescriptionConverter"/>

然后在 xaml 中:

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

【讨论】:

  • 我没有看到 AssetDescriptions 列表的绑定。它如何知道从哪里获取数据?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-19
  • 1970-01-01
相关资源
最近更新 更多