我按照 this 实现了动态数据网格链接。
我正在使用 Converter 绑定(bind)来自 ExpandoObject
的值。这些列显示学校的总单元数等值。
Item ItemCount DefaultSchool School1 School2 School3
X-Item 200 100 50 50 0
可以随时动态添加学校。现在,如果我添加具有 40 个单元的 School4,我想从默认学校中扣除相同的单元数(DefaultSchool = 60,School4 = 40)。
我可以在转换器中进行计算,ItemsSource 也会显示更新后的值,但它不会反射(reflect)在 UI 上。
我将 TextBox 的 LostFocus
事件与 MyDataGrid.Items.Refresh
一起使用,它确实会更新 UI,但每次失去焦点时,UI 也会闪烁,就像刷新网页一样)。
我只需要更新当前行。因为我正在使用 ExpandoObject
,所以我不能使用 INotifyPropertyChanged
(我相信?),那么在这种情况下最好的方法是什么?
那么我应该如何更新 UI?
最佳答案
我相信这不是 ExpandoObject
未实现 INotifyPropertyChanged
的问题(因为 it does)。
我的想法是,您的问题是 INotifyCollectionChanged
和使用转换器的组合。发生的情况是当属性更改时调用转换器,但当集合更改时不调用它们。这将导致在绑定(bind)集合中添加或删除项目时 UI 不更新。
您可以查看这些问题以获取有关此问题的更多信息:
- How do I update an IValueConverter on CollectionChanged?
- Why is Converter not called when Collection changes?
您可以通过在您的转换器中设置一个断点来查看这是否真的是您的问题,并查看它是否在您添加新项目时被调用。如果这确实是问题所在,您可以尝试在不使用转换器的情况下解决这个问题,或者使用 MultiValueConverter
也将接收 Count
属性(它只会充当触发器),像这样:
<DataGrid>
<DataGrid.ItemsSource>
<MultiBinding Converter="{local:MyConverter}">
<Binding Path="Items" />
<Binding Path="Items.Count" />
</MultiBinding>
</DataGrid.ItemsSource>
</DataGrid>
public class MyConverter : MarkupExtension, IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
// Your converter logic which will use values[0] (the bound collection).
// Ignore anything else in the values[] array.
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
public override object ProvideValue(IServiceProvider serviceProvider)
{
return this;
}
}
关于c# - UI 不更新 ExpandoObject 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12954279/