5

我已经按照这个链接实现了动态数据网格。

我正在使用 Converter 绑定来自ExpandoObject. 这些列显示了学校的总单位等值。

Item      ItemCount DefaultSchool School1  School2 School3

X-Item    200       100           50       50      0

学校可以随时动态添加。现在,如果我添加具有 40 个单位的 School4,我想从默认学校中扣除相同的值(DefaultSchool = 60,School4 = 40)。

我可以在转换器中进行此计算,并且 ItemsSource 也显示更新的值,但它不会反映在 UI 上。

我使用TextBox的LostFocus事件MyDataGrid.Items.Refresh,它确实更新了UI,但是每次失去焦点时,UI也会闪烁,就像一个令人耳目一新的网页)。

我只需要更新当前行。当我使用时ExpandoObject,我不能使用INotifyPropertyChanged(我相信?),那么在这种情况下最好的方法应该是什么?

那么我应该如何更新 UI 呢?

4

4 回答 4

1

默认 DataGridColumn 有一次绑定,这意味着它仅在第一次加载和显示值,正弦绑定需要事件连接,这对性能开销很小,所以他们可能已经这样做了。我们遇到了同样的问题,唯一的解决方案是使用单元格模板,如下所示。

<DataTemplateGridColumn Header="DefaultSchool">
     <DataTemplateGridColumn.CellTemplate>
          <TextBlock Text="{Binding DefaultSchool}"/>
     </DataTemplateGridColumn.CellTemplate>
</DataGridTemplateColumn>

如果您正在动态生成列,那么您将需要这样的东西。

var t = new DataTemplate();
t.VisualTree = new FrameworkElementFactory((typeof(TextBlock));
t.VisualTree.SetBinding(new Binding(columnName));

var c = new DataGridTemplateColumn();
c.CellTemplate = t;
c.Header = columnName;

dg.Columns.Add( c );
于 2012-10-27T08:07:02.187 回答
1

我相信这不是ExpandoObject不实施的问题INotifyPropertyChanged(因为它确实)。

我在想的是你的问题是INotifyCollectionChanged转换器的组合和使用。发生的情况是,当属性更改时会调用转换器,但在集合更改时不会调用它们。当从绑定集合中添加或删除项目时,这将导致 UI 不更新。

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

您可以通过在转换器中设置断点并查看添加新项目时是否调用它来查看这是否真的是您的问题。如果这确实是问题所在,您可以尝试在不使用转换器的情况下解决此问题,或者使用MultiValueConverter也将接收该Count属性(仅充当触发器)的 a ,如下所示:

<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;
    }
}
于 2012-10-20T21:29:46.300 回答
0

确保 XAML 绑定中有 Mode=TwoWay。

INotifyCollectionChanged 将确保在您添加/删除集合中的项目时绑定将得到通知,但如果您修改/更新集合中的对象(对象 DefaultSchool),则 INotifyCollectionChanged 不会帮助您。

您需要在 School 类中实现 INotifyPropertyChanged 以使绑定在集合中该类的对象的更新/修改时得到通知。

于 2012-10-22T07:04:09.903 回答
0

尝试像这样设置您的窗口或用户控件数据上下文。datacontext = this.datacontext 并且 itemsource 具有您想要的数据的路径。如果您不设置数据上下文,则 itemsource 无法绑定到您的对象。如果仍然无法正常工作,请尝试在 ItemSource 中的项目上制作数据模板。最后使用 ObservableCollection,这样您就不必实现那些 INotifyProperty ...

于 2012-10-23T21:43:56.733 回答