【问题标题】:WPF Binding a textbox to Current selected row of a datagridWPF将文本框绑定到数据网格的当前选定行
【发布时间】:2012-01-15 03:24:30
【问题描述】:

我已经找过了,但找不到我要找的东西。我有一个 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" />

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 对不起,我没有澄清,当“选择的行”发生变化时,我确实有一个 INotifyPropertyChanged 实现......但是,数据网格不应该呈现正在更新的 dataviewrow 的内容。 ..
      猜你喜欢
      • 2012-09-26
      • 2014-01-29
      • 2015-08-19
      • 2012-06-05
      • 2016-07-19
      • 2011-05-28
      • 1970-01-01
      • 2010-12-12
      • 2011-01-31
      相关资源
      最近更新 更多