我正在使用 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/