我看过,无法找到我正在寻找的东西。我有一个MVVM环境。在View模型上,我从数据库连接/查询的数据中获得了数据表。我已将一个属性(getter / setter)暴露为" DataView"基于" TheTable.DefaultView"。
我在窗口中有一个数据网格,它绑定到数据视图......没问题。
<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" >
对于&#34; SelectedItem&#34;上面,它也来自ViewModel上通过其(getter / setter)公开的属性。
现在,我的问题。当我向下滚动数据网格中的记录列表时,我有其他文本框控件来显示比网格列表提供的更多数据。我希望能够编辑&#34;当前行&#34;的数据,所以我有一个文本框,其中包含尽可能多的设置,但有些事情仍然不对。
<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" />
如果我滚动并且处于数据的编辑模式,并更改与当前行关联的文本框中的值,并且此值是网格中显示的列之一,则数据网格本身不显示改变了的价值。但是,如果我继续滚动并返回同一记录,则文本框中的值显示已更改为值。
那么,我如何强制将网格数据源视为更新,因为特定行中的单个列已更改,并且网格本身也已更新。感谢...
答案 0 :(得分:0)
您的datagrid绑定到SomeType类型的某些元素的集合。要完成任务,您需要在SomeType中实现INotifyPropertyChanged(如果有的话,还可以从ViewModelBase继承)。您可以在此处查看一个好的示例:http://www.hightech.ir/SeeSharp/best-implementation-of-inotifypropertychange-ever
答案 1 :(得分: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");
}
}