当我的数据绑定DXGrid的列表更新时,网格的滚动条会更新,但网格的主体不会更新,至少不会立即更新。一旦我点击网格滚动条,身体就会刷新。
为了说明 - 这是我的应用程序处于初始状态:
当我向基础列表添加四个新对象时,只有滚动条发生变化:
最后,当我按下滚动条底部的“向下”按钮时,整个网格会刷新:
预期行为:每当更新基础数据库列表时,网格都应该正确刷新,而不是在用户尝试与列表交互时更新。
我的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
。除了TimeSeriesPresenter
和BuilderProject
(如上所示)之外,还有TimeSeriesDefinition
的摘要:
public class TimeSeriesDefinition : ViewModelBase
{
public string SeriesID
{
get { return mSeries; }
set {
if (!Equals(mSeries, value) {
mSeries = value;
OnPropertyChanged("SeriesID");
}
}
}
... etc ...
}
答案 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<>
。保持两个列表同步是一个开销,但不难做对。