WPFは、TextBoxをデータグリッドの現在の選択した行にバインドします

StackOverflow https://stackoverflow.com/questions/8418326

質問

私は見たことがあり、探しているものを見つけることができません。 MVVM環境があります。ビューモデルでは、データベース接続/クエリからのデータからデータテーブルを使用できます。 「getter/setter)を「theTable.defaultView」に基づいた「DataView」として公開しました。

ウィンドウにDatagagridがあり、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" />

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

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

役に立ちましたか?

解決 2

うわー...数日前からさらに掘り下げた後、私はついにそれを割ったので、ここに私がそれを修正した方法があります。

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

他のヒント

Datagridは、sometypeのいくつかの要素のコレクションにバインドされています。タスクを作成するには、inotifyPropertyChangedをshomeTypeに実装する必要があります(または、viewmodelbaseから継承している場合は)。ここで良いサンプルを見ることができます: http://www.hightech.ir/seesharp/best-implementation-of-inotifypropertychange- ever

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top