首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使DXGrid控件在DataBound时正确更新

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

Stack Overflow用户
提问于 2011-06-30 03:52:51
回答 2查看 4.9K关注 0票数 2

当我的数据库DXGrid下面的列表被更新时,网格的滚动条会更新,但是网格的主体不会更新,至少不会马上更新。一旦我单击网格滚动条,主体就会刷新。

为了说明-下面是我在初始状态下的应用程序:

当我向基础列表中添加四个新对象时,只有滚动条更改:

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

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

用于我的GridControl的Xaml如下所示:

代码语言:javascript
复制
    <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

代码语言:javascript
复制
public class TimeSeriesPresenter : ITimeSeriesPresenter
{
    public TimeSeriesPresenter(ITimeSeriesVisual view)
        : base(view) { ... }

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

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

BuilderProject看起来是这样的:

代码语言:javascript
复制
public class BuilderProject : ViewModelBase
{
    public IList<TimeSeriesDefinition> TimeSeries
    { get { ... } }
    ...
}

这两个对象都实现了INotifyPropertyChanged,并且属性正确地触发了PropertyChanged事件。所以,一切都应该正常,对吧?

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

DXGrid是否需要某种“模式”才能正常执行DataBinding?我遗漏了什么?

更新

我的所有数据对象都是从ViewModelBase继承的,后者实现了INotifyPropertyChanged接口。除了TimeSeriesPresenterBuilderProject (如上文所示),下面是TimeSeriesDefinition的总结

代码语言:javascript
复制
public class TimeSeriesDefinition : ViewModelBase
{
    public string SeriesID
    {
        get { return mSeries; }
        set { 
            if (!Equals(mSeries, value) {
                mSeries = value;
                OnPropertyChanged("SeriesID");
            }
        }
    }
    ... etc ...
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-05 20:22:19

问题的根源是这样的代码:

代码语言:javascript
复制
public class BuilderProject : ViewModelBase
{
    public IList<TimeSeriesDefinition> TimeSeries
    { get { ... } }
    ...
}

尽管应该支持IList<T>,但实际上它并不支持。

必要的解决方法是改为使用ObservableCollection<T>

代码语言:javascript
复制
public class BuilderProject : ViewModelBase
{
    public ObservableCollection<TimeSeriesDefinition> TimeSeries
    { get { ... } }
    ...
}

在我的例子中,这导致了两个列表的并行维护--表示不可知论模型中的底层IList<>和ViewModel中的ObservableCollection<>。保持两个列表保持同步是有点开销,但并不难做到。

票数 1
EN

Stack Overflow用户

发布于 2011-06-30 15:44:52

让我补充一些补充资料。您告诉过ViewModel和DataSource实现了INotifyPropertyChanged接口。我的假设正确吗?数据对象没有实现这个接口吗?如果是这样的话,我倾向于认为这就是这个问题的原因。

如果数据对象类(TimeSeriesDefinition ?)实现这个接口,一切都应该正常工作。

此外,造成此问题的一个可能原因是您正在绑定到一个复杂的fieldName,即

FieldName="Row.Text“

如果是这样的话,请告诉我,我们会让你知道如何解决这个问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6529769

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档