c# - 如何将转换器应用于 ObservableCollection 的每个项目?

标签 c# wpf mvvm

我正在使用 C# 和 .NET 4.5 创建 MVVM 桌面应用程序。我有一组 View 模型条目,它们已经包含在 ObservableCollection<MyEntryClass> 中。 .

我需要使用第三方控件来显示数据。此控件要求将条目转换为它们自己的条目类。他们提供了一个使用 XAML 和 IValueConverter 的示例来说明如何做到这一点。 .归结为 ...Items="{Binding Path=The.Source, Converter={StaticResource CustomDataConverter}}...和一个大致如下实现的转换器:

public class CustomDataConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        IEnumerable<CustomItem> dataContext = value as IEnumerable<CustomItem>;
        ObservableCollection<OutputItem> items = new ObservableCollection<OutputItem>();
        foreach (CustomItem customItem in dataContext)
        {
            OutputItemitem =
                new OutputItem
                {
                    // ... some value transfers ...
                };
            items.Add(item);
        }
        return items;
    }

虽然这适用于控件的初始化,但它破坏了控件和 ObservableCollection 之间的“观察链”。在绑定(bind)中指定 - 仅仅是因为自定义转换器创建了自己的项目列表。有没有办法更改绑定(bind)指令,以便转换器不会为整个源集合调用一次,而是为每个集合元素调用一次?如果不是,有哪些替代策略来处理这种情况?

(在上面的示例中,我遗漏了一些代码,这些代码将事件处理程序注册到源对象的 PropertyChanged 事件并更新目标对象。个别项目属性的更新工作正常,只是列表的更新未处理.)

编辑:有问题的第三方控件是 GanttChartDataGrid来自 Gantt Chart Light Library .

最佳答案

如果此第三方控件提供这种可能性,您可以尝试在 ItemTemplate 中使用转换器。使用标准的 WPF 控件,它应该是这样的:

<ListBox ItemsSource="{Binding Path=The.Source}">
  <ListBox.ItemTemplate>
    <DataTemplate>
      <ContentPresenter Content="{Binding Converter={StaticResource CustomDataConverter}}" 
                    ContentTemplate="{StaticResource MyOptionalDataTemplate}"/>
    </DataTemplate>
  </ListBox.ItemTemplate>
</ListBox>

但也许实现这一目标的最简单方法是绑定(bind)一个包含 OutputItems 的集合......

关于c# - 如何将转换器应用于 ObservableCollection 的每个项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22593650/

相关文章:

c# - 如何在 Entity Framework 和 EF Core 中使用 .Include()

c# - 不区分大小写的 Array.Contains 在 Linq 查询中

c# - NavigationWindow - 它在哪里?

c# - 变量的绑定(bind)与显式赋值

c# - 为什么要使用像 Exit Game 的 Photon 这样的服务器?

c# - 在 C# 中运行更新查询后数据库没有变化

c# - 如何使用 wpf c# 中的类将值从一个表单传递到另一个表单?

c# - 在 WPF Prism 应用程序中实现键盘绑定(bind)的正确方法

wpf - 从 WPF DataGrid 中的按钮触发 RelayCommand

c# - 在连接的节点之间画线