0

調べてみましたが、探しているものがまったく見つかりません。私はMVVM環境を持っています。View モデルには、データベース接続/クエリからのデータから利用できる Datatable があります。「TheTable.DefaultView」に基づく「DataView」としてプロパティ (getter/setter) を公開しました。

データビューにバインドするウィンドウにデータグリッドがあります...問題ありません。

<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" />

スクロールしてデータの編集モードにあり、現在の行に関連付けられているテキストボックスの値を変更し、この値がグリッドに表示されている列の1つである場合、データグリッド自体は変更された値を表示しません. ただし、スクロールを続けて同じレコードに戻ると、テキストボックスの値は変更された値を示します。

したがって、特定の行の個々の列が変更され、グリッド自体も更新されたときに、グリッド データ ソースも更新されたと見なされるように強制するにはどうすればよいでしょうか。ありがとう...

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 に答える