c# - UI 不更新 ExpandoObject 列表

标签 c# wpf user-interface inotifypropertychanged expandoobject

我按照 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 不更新。

您可以查看这些问题以获取有关此问题的更多信息:

您可以通过在您的转换器中设置一个断点来查看这是否真的是您的问题,并查看它是否在您添加新项目时被调用。如果这确实是问题所在,您可以尝试在不使用转换器的情况下解决这个问题,或者使用 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/

相关文章:

c# - 如何判断一个视频格式是否被支持

c++ - 具有自由许可的跨平台 Gui 库

python - 如何构建一个 GUI 以在 jupyter notebook 中使用?

c# - 此 C++ 代码的 C# 等价物是什么(带有 InPtr)

c# - 将代码翻译成类

c# - 消息框显示没有空格?

c# - 绑定(bind)到 Caps Lock

javascript - 在 C# 中使用 JavaScript 数组填充 Razor 表

c# - 更新 LongListSelector

html - 需要文本为窗口的 100% 高度和宽度,不多也不少