WPF将文本框绑定到数据网格的当前选定行

时间:2011-12-07 15:58:50

标签: c# wpf 2-way-object-databinding

我看过,无法找到我正在寻找的东西。我有一个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" />

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

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

2 个答案:

答案 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");
       }
}