私はC#/ WPF/Entity Framework DBに、まずクーラントラインからのフローや温度などの値を測定する独自の産業用ハードウェアと通信するアプリケーションを作成しています。これらの値は、バックグラウンドで実行されるスレッドでSQL Serverデータベース内で頻繁に更新され、UIに表示されます。データベースの変更としてWPF UIを更新する方法
私の懸念は、現在、私がこれらの変更を反映するためにUIを更新する方法です。私は私のviewmodelに私のDataContextを設定
、および毎秒実行するスレッドをインスタンス化します:ここで私はデータグリッドを更新する方法の例です
_DataContext = new ViewModels.SummaryTable_ViewModel();
this.DataContext = _DataContext;
UIUpdateThread = new Thread(UIUpdaterThread);
UIUpdateThread.IsBackground = true;
UIUpdateThread.Start();
私のグリッドのベースとなるモデルはIListの<です>それは次のようになります。
private IList<channel> _channel;
public IList<channel> Channels
{
get
{
return _channel;
}
set
{
_channel = value;
//NotifyPropertyChanged();
OnPropertyChanged("Channels");
}
}
が続い毎秒私UIUpdateThreadは、以下のようになる()メソッド私のFillChannelsを呼び出し、その後のPropertyChanged通知に基づいて、グリッドの更新:
using (var DTE = new myEntities())
{
if (DTE.channels.Any())
{
var q = (from a in DTE.channels
where a.setup.CurrentSetup == true
orderby a.ChannelNumber
select a).ToList();
this.Channels = q;
}
}
私の質問はこれです:これを行うには、より良い、よりエレガントな方法はありますか?これはより良い言葉の欠如のために "間違っている"と感じます。また、スレッドが実行されるたびに、データグリッドでユーザー設定のソートをリセットするなど、悪い副作用があります。また、私はそれがMVVMのパターンを破ると思うが、私は確信していない。
たとえば、私のハードウェアと通信しているスレッドがデータのハードウェアをポーリングするたびにShared Channelオブジェクトを更新し、UIをバインドするだけではこのスレッド(または同じことをする他のUIの他のスレッド)を実行し、PropertyChanged通知に基づいて更新するだけです。または、私が完全に気付いていない他の方法がいくつかありますか?答えを探しているとき、私にはわかりませんが、仕事パターンの単元がここに関連する概念であることがわかりました。
ここからわかるように、私はここからどこに行くべきかについてはあまりよく分かりません。テキストの壁には申し訳ありませんが、できるだけ徹底したかっただけです。どんな支援も大歓迎です。ありがとう。
私は、 'Channels'を' ObservableCollection'にしてから始めましょう。アイテムが追加または削除された場合は、コレクションを再作成する代わりにアイテムを追加/削除します。一般的に、2番目から最後の段落はお金の上にあります:適切な変更通知を提起する既存のものを変更する。新しい現在の状態全体にぴったりと並んでいることに比べてちょっと絡まってしまいますが、もしそれをする必要があれば、それをする必要があります。 P.S .: rory.apが言ったこと。 –
ヘルプありがとうございます@EdPlunkett – user3900520