0

我已经看过并且找不到我要找的东西。我有一个 MVVM 环境。在视图模型上,我有一个可从数据库连接/查询的数据中获得的数据表。我已经将一个属性(getter/setter)公开为基于“TheTable.DefaultView”的“DataView”。

我在窗口中有一个绑定到数据视图的数据网格......没问题。

<DataGrid AutoGenerateColumns="False" 
   Name="dataMyData"
   ItemsSource="{Binding Path=ViewModelViewProperty, 
   NotifyOnSourceUpdated=True, 
   NotifyOnTargetUpdated=True}"
   SelectedItem="{Binding Path=JustOneRecordInView, Mode=TwoWay}"
   SelectionMode="Single"
   SelectionUnit="FullRow"
   GridLinesVisibility="Horizontal"
   CanUserDeleteRows="False"
   CanUserAddRows="False" >

对于上面的“SelectedItem”,它也来自通过其(getter/setter)暴露在 ViewModel 上的属性。

现在,我的问题。当我向下滚动数据网格中的记录列表时,我有其他文本框控件来显示比网格列表提供的更多数据。我希望能够编辑“当前行”的数据,所以我有一个文本框,里面有我能想到的尽可能多的设置,但还是有问题。

<TextBox 
   Text="{Binding Path=PropertyForCurrentRecord[SpecificColumnInDataViewRow], 
        Mode=TwoWay, 
        UpdateSourceTrigger=PropertyChanged, 
        ValidatesOnDataErrors=True, 
        ValidatesOnExceptions=True,
        BindsDirectlyToSource=True,
        NotifyOnSourceUpdated=True,
        NotifyOnTargetUpdated=True,
        NotifyOnValidationError=True}"
    Name="textBox1" VerticalAlignment="Top" Width="40" />

如果我滚动并处于数据的编辑模式,并更改与当前行关联的文本框中的值,并且该值是网格中显示的列之一,则数据网格本身不会显示更改的值. 但是,如果我继续滚动并返回同一条记录,则文本框中的值会显示更改为值。

那么,当特定行中的单个列已更改并且网格本身也已更新时,如何强制将网格数据源也视为已更新。谢谢...

4

2 回答 2

0

您的数据网格绑定到 SomeType 类型的一些元素的集合。要完成您的任务,您需要在 SomeType 中实现 INotifyPropertyChanged (或者从 ViewModelBase 继承,如果有的话)。您可以在这里查看一个很好的示例:http: //www.hightech.ir/SeeSharp/best-implementation-of-inotifypropertychange-ever

于 2011-12-07T17:10:01.383 回答
0

哇...经过几天前的更多挖掘之后,我终于破解了它,这就是我修复它的方法。

private bool AcceptingTheChanges = false;
private DataRowView myRecord;
public DataRowView MyRecord
{
   get { return myRecord; }
   set {
          if (myRecord != null)
                myRecord.Row.Table.AcceptChanges();

          // Now, get the incoming value and re-store into private
          myRecord = value;
          // Finally, raise event that it changed to refresh window...
          RaisePropertyChanged("MyRecord");
       }
}
于 2011-12-07T18:27:29.543 回答