1

デザインパターンMVVMで問題が発生しました。私のビューでは、ビューモデルのデータテーブルにバインドされたデータグリッドを取得しました。

        <WPF:BADataGrid Grid.Column="1" x:Name="dgStapelliste" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" ItemsSource="{Binding Stapelliste, Mode=OneWay}"/>

ビューモデルのコンストラクターで、ItemsSourceをロードします。

        this.StapelListe = this._stapel.Get();

実行時にボタンを使用して行を追加すると、すべて正常に機能します。ただし、ボタンを押してデータグリッドを更新するのではなく、スレッドワーカーまたはバックグラウンドワーカーで自動的に更新する必要があります。

ここにいくつかのテスト例があります:

        BackgroundWorker worker = new BackgroundWorker();
        worker.DoWork += delegate(object s, DoWorkEventArgs args)
        {
            while (true)
            {
                Thread.Sleep(5000);

                DataRow row = this.StapelListe.NewRow();
                row["StapelNr"] = 123456;
                this.StapelListe.Rows.Add(row);
            }
        };

これは機能しません...そして理由はわかりません...行はデータテーブル「StapelListe」に追加されますが、データグリッドはそれ自体を更新しません...

スレッド内のデータテーブルの既存の行を変更すると、機能します。コレクションに行を追加したり、コレクションから行を削除したりすることはできません。

誰かがこれがなぜ起こるのか、そして/またはそれをどのように解決するのか考えましたか?

敬具...

4

2 に答える 2

2

あなたはデータバインディングの古典的な間違いを犯します。何かが変更されたことをGUIに通知しない場合、画面が更新されるとどのように想定する必要がありますか。これを行うには、 NotifyPropertyChangedインターフェイスを使用する必要があります。

INotifyPropertyChangedインターフェイスからビューモデルを実装します。

これは、作業に使用できるコードスニペットです。

これを機能させるためにスレッドを使用する必要はありません。コレクションを更新した後にNotifyProperyChangedを呼び出す限り、何でも問題ありません。

ObservableCollectionを使用していない場合は、リストの参照を更新する必要があります。これは、アプリのパフォーマンスに少し負担をかけます。

     BackgroundWorker worker = new BackgroundWorker();
        worker.DoWork += delegate(object s, DoWorkEventArgs args)
        {
            while (true)
            {
                Thread.Sleep(5000);
                DataRow row = this.StapelListe.NewRow();
                row["StapelNr"] = 123456;
                this.StapelListe.Rows.Add(row);
                Datatable dt=new datatable(); //new reference
                foreach (DataRow dr in StapelListe.Rows)
                {     
                 dt.Rows.Add(dr.ItemArray);
                }

                 StapelList=dt; //updating the reference of property
                 // when the above line executes your property setter fires
                 // and calls notifyproperty changed and then all done
        };
于 2012-12-07T09:19:38.580 に答える
1

MegaMindが書いたように、ビューは何かが変更されたことを知る必要があります。既存のDataTableに新しい行を追加する場合、何かが追加されたことがビューに通知されることはありません。したがって、そのために作成されたコレクションを使用する必要がありますObservableCollection<T>

于 2012-12-07T09:27:23.763 に答える