如何在DataBound时正确更新DXGrid控件

时间:2011-06-30 03:52:51

标签: wpf mvvm devexpress

当我的数据绑定DXGrid的列表更新时,网格的滚动条会更新,但网格的主体不会更新,至少不会立即更新。一旦我点击网格滚动条,身体就会刷新。

为了说明 - 这是我的应用程序处于初始状态:

Empty Grid

当我向基础列表添加四个新对象时,只有滚动条发生变化:

Scrollbar Changes

最后,当我按下滚动条底部的“向下”按钮时,整个网格会刷新:

Refreshed Grid

预期行为:每当更新基础数据库列表时,网格都应该正确刷新,而不是在用户尝试与列表交互时更新。

我的GridControl的Xaml看起来像这样:

    <dxg:GridControl dxlc:DockLayoutControl.Dock="Client" 
                     ItemsSource="{Binding Project.TimeSeries}">

        <dxg:GridControl.Columns>
            ... omitted ...
        </dxg:GridControl.Columns>
        <dxg:GridControl.View>
            <dxg:TableView Name="tableView1"
                           AllowEditing="False"
                           AllowColumnFiltering="True"
                           ShowAutoFilterRow="True"
                           ShowGroupPanel="False" 
                           FocusedRow="{Binding SelectedTimeSeries, Mode=TwoWay}"/>
        </dxg:GridControl.View>
    </dxg:GridControl>
表单的

DataContext设置为TimeSeriesPresenter

public class TimeSeriesPresenter : ITimeSeriesPresenter
{
    public TimeSeriesPresenter(ITimeSeriesVisual view)
        : base(view) { ... }

    public BuilderProject Project 
        { get { ... } set { ... } }

    public TimeSeriesDefinition SelectedTimeSeries 
        { get { ... } set { ... } }

BuilderProject看起来像这样:

public class BuilderProject : ViewModelBase
{
    public IList<TimeSeriesDefinition> TimeSeries
    { get { ... } }
    ...
}

这两个对象都实现INotifyPropertyChanged,属性正在触发PropertyChanged事件。那么,应该的一切正常工作,对吗?

显然,DXGrid正在从视图模型接收某种更新,因为滚动条会发生变化。但为什么不完全重新粉刷?

DXGrid是否需要某种“模式”来正常进行DataBinding? 我错过了什么?

更新

我的所有数据对象都继承自实现ViewModelBase接口的INotifyPropertyChanged。除了TimeSeriesPresenterBuilderProject(如上所示)之外,还有TimeSeriesDefinition的摘要:

public class TimeSeriesDefinition : ViewModelBase
{
    public string SeriesID
    {
        get { return mSeries; }
        set { 
            if (!Equals(mSeries, value) {
                mSeries = value;
                OnPropertyChanged("SeriesID");
            }
        }
    }
    ... etc ...
}

2 个答案:

答案 0 :(得分:1)

让我补充一些其他信息。您告诉ViewModel和DataSource实现INotifyPropertyChanged接口。我在我的假设中是正确的,数据对象没有实现这个接口?如果是这样,我倾向于认为这是造成这个问题的原因 如果数据对象类(TimeSeriesDefinition?)实现了这个接口,那么一切都应该正常工作。

此外,此问题的可能原因是您绑定到复杂的fieldName,即

字段名= “Row.Text”

如果是这种情况,请告诉我们,我们会告诉您如何解决问题。

答案 1 :(得分:1)

问题的根源是这段代码:

public class BuilderProject : ViewModelBase
{
    public IList<TimeSeriesDefinition> TimeSeries
    { get { ... } }
    ...
}

即使IList<T> 应该支持,但实际上并非如此。

必要的修复方法是改为使用ObservableCollection<T>代替:

public class BuilderProject : ViewModelBase
{
    public ObservableCollection<TimeSeriesDefinition> TimeSeries
    { get { ... } }
    ...
}

就我而言,这导致了两个列表的并行维护 - 表示不可知模型中的基础IList<>和ViewModel中的ObservableCollection<>。保持两个列表同步是一个开销,但不难做对。