DevExpress Grid:属性属性的通知适用于xaml声明的gridcolumn,但不适用于以编程方式添加的gridcolumn

时间:2017-07-15 20:37:38

标签: c# wpf xaml devexpress-wpf

我已经构建了一个UserControl,其中包含一个DevExpress GridControl,当一个" UCKit"时,它以编程方式添加了GridColumns。 (包含UserControl的各种参数,包括列规范)绑定到控件。其中一列绑定到ObservableCollection的Count属性,该属性是构成GridControl的ItemsSource的类的属性,并且不响应PropertyChanged通知,甚至不响应通过调用进行的暴力更新尝试grid.RefreshData()。我编写了一个在xaml中使用简单GridColumn声明的测试程序,并且Count列工作正常,但是我无法获得GridColumns在代码中构建的网格以进行更新。

这里是成功更新的xaml:

    <dxg:GridControl Grid.Column="0" HorizontalAlignment="Stretch" Name="griddywiddy2" AutoGenerateColumns="None"
                     Grid.Row="2" Grid.ColumnSpan="4" VerticalAlignment="Stretch" ItemsSource="{Binding MyDataColl, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}">
        <dxg:GridControl.View>
            <dxg:TableView AllowPerPixelScrolling="True" ShowTotalSummary="True"/>
        </dxg:GridControl.View>
        <dxg:GridControl.Columns>
            <dxg:GridColumn Header="Row Name" Width="Auto" FieldName="RowName"/>
            <dxg:GridColumn Header="Count" Width="Auto" FieldName="Stringz.Count"/>
        </dxg:GridControl.Columns>
    </dxg:GridControl>

xaml + c#代码没有(行名更新,Count没有):

    <dxg:GridControl Grid.Column="0" HorizontalAlignment="Stretch" Name="griddywiddy" AutoGenerateColumns="None"
                     Grid.Row="1" Grid.ColumnSpan="4" VerticalAlignment="Stretch" ItemsSource="{Binding MyDataColl, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}">
        <dxg:GridControl.View>
            <dxg:TableView AllowPerPixelScrolling="True" ShowTotalSummary="True"/>
        </dxg:GridControl.View>
    </dxg:GridControl>

    private void InitializeColumns()
    {
        griddywiddy.Columns.Add(
            new DevExpress.Xpf.Grid.GridColumn()
            {
                Header = "Row Name",
                Binding = new Binding("RowName")
                {
                    Mode = BindingMode.TwoWay,
                    Converter = null
                },
                Width = 100
            });
        griddywiddy.Columns.Add(
            new DevExpress.Xpf.Grid.GridColumn()
            {
                Header = "Count",
                Binding = new Binding("Stringz.Count")
                {
                    Mode = BindingMode.OneWay,
                    Converter = null
                },
                Width = 100
            });
    }

我的两种更新方法(对于xaml声明的列和代码构建的Row Name列都有效)(在我的测试程序中的按钮单击处理程序中调用):

    private void UpdBtn_Click(object sender, RoutedEventArgs e)
    {
        griddywiddy.RefreshData();
        griddywiddy2.RefreshData();
    }

    private void UpdBtn2_Click(object sender, RoutedEventArgs e)
    {
        MyData incer = MyDataColl[0];
        incer.NotifyPropertyChanged("Stringz.Count");
        incer.NotifyPropertyChanged("RowName");
    }

我真的对于为什么这个Count属性在xaml情况下正常工作而不是代码构建的情况感到困惑。有人可以提出建议吗?

1 个答案:

答案 0 :(得分:0)

我注意到在创建GridColumn时使用Binding = new Binding(“Stringz.Count”)(我做的失败)并不等同于设置GridColumn的FieldName =“Stringz.Count” (我在xaml中做了什么工作。)因此,对于这些“嵌套”通知(调用复杂路径),请使用指定GridColumn的FieldName方法。

这个解决方案来自DevExpress的人们,顺便说一句,非常感谢他们!