6

基本: 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% を書き直す必要があり、行を削除するときにデータセットをクリアして再度埋める必要があるためです。変更、データテーブルを補充するとき、リストビューはそれを認識し、それ自体を更新する必要があります

4

2 に答える 2

0

バインド モードを双方向に設定する必要がある場合があります。

Mode = BindingMode.TwoWay

自明ではないいくつかの理由により、WPF はデフォルトで一方向バインディングになります。それが役立つことを願っています。私は特に詳しいわけではありませんが、ObservableCollections への単純なデータ バインディングでこの問題を確認しており、TwoWay バインディングで修正されています。

于 2012-12-28T06:04:18.173 に答える