基本: ListView を含むウィンドウがあり、グリッドのデータ コンテキストによって入力されます。
mainGrid.SetBinding(Grid.DataContextProperty,
new Binding() {
Source = new DataView()
{ Table = SQLHandler.GetHandler[classType.ToString()] }
}
);
xamlで:
<ListView Grid.Row="1" Grid.Column="1" Grid.ColumnSpan="2" ItemsSource="{Binding}">
すべてが正常に機能し、データが取り込まれています。上記のように、Singleton からアクセスできる SQLHandler クラスがあり、インデクサーを使用してテーブルにアクセスできます。
問題: ウィンドウが読み込まれ、行を選択して [編集] ボタンをクリックすると、新しいウィンドウが読み込まれ、選択した行の詳細が表示されます。この新しいウィンドウからこの行を削除して閉じると、それに応じてメイン ウィンドウ (完全なデータ テーブルが表示される場所) が更新されません。私は解決策がどうあるべきかを知っていますが、それを機能させることはできません。(inotifyproperty はインターフェイスを SqlHandler クラス、Binding.IndexerName などに変更しました。)
ここに主なものがあります: データセットは私の SqlHandler クラスではなく、すべての sqlcommands が実行されている SqlExecuter にあります。
public override DataTable this[string key]
{
get
{
if (sqlExecuter.GetDataSet.Tables.Contains(key))
return sqlExecuter.GetDataSet.Tables[key];
throw new KeyNotFoundException("The specified key was not found");
}
}
ここで、GetDataSet は次のとおりです。
public DataSet GetDataSet
{
get { return ds; }
}
どうすればこれを機能させることができますか?別のウィンドウで行を削除してその行を閉じると、メインウィンドウのリストビュー自体が更新されません。私が持っている唯一のオプションは、更新ボタンを配置してから datacontext プロパティを再バインドすることです。もちろん、それは機能していますが、私の目標は「ライブ」更新システムを持つことです。結局のところ、それがバインディングの目的です。
私が試したこと: SqlExecuter の GetDataSet: inotifypropertychanged インターフェイスを実装しましたが、何も変わりませんでした。また、SqlHandler のインデクサーに inotifypropertychanged を実装することはできません。セッターがないためです。常にコード ビハインドからテーブルにアクセスしているだけで、sqldataadapter がデータを入力しています (Fill メソッド)。
ps: ObservableCollection を作成するつもりはありません。コードの 90% を書き直す必要があり、行を削除するときにデータセットをクリアして再度埋める必要があるためです。変更、データテーブルを補充するとき、リストビューはそれを認識し、それ自体を更新する必要があります