UI DispatcherをViewModelに渡す方法
2023-09-18 04:55:49
質問
にアクセスできるようにする必要があります。 ディスパッチャ を View に属する ViewModel に渡す必要があります。しかし、View は ViewModel について何も知らないはずです。では、どのようにして渡すのでしょうか?インターフェイスを導入するか、インスタンスに渡す代わりに、View によって書き込まれるグローバルなディスパッチャのシングルトンを作成しますか?あなたのMVVMアプリケーションやフレームワークでこれをどのように解決しますか?
EDIT: 私のViewModelsはバックグラウンドスレッドで作成されるかもしれないので、私は単に
Dispatcher.Current
をViewModelのコンストラクタで実行することはできません。
どのように解決するのですか?
ディスパッチャをインターフェースで抽象化し IContext :
public interface IContext
{
bool IsSynchronized { get; }
void Invoke(Action action);
void BeginInvoke(Action action);
}
これは、ViewModelsのユニットテストをより簡単に行えるという利点があります。
私はMEF (Managed Extensibility Framework)を使ってViewModelsにインターフェースを注入しています。他の可能性としては、コンストラクタの引数でしょう。
しかし、私はMEFを使用した注入がより好きです。
更新しました(コメント中のpastebinリンクからの例)。
public sealed class WpfContext : IContext
{
private readonly Dispatcher _dispatcher;
public bool IsSynchronized
{
get
{
return this._dispatcher.Thread == Thread.CurrentThread;
}
}
public WpfContext() : this(Dispatcher.CurrentDispatcher)
{
}
public WpfContext(Dispatcher dispatcher)
{
Debug.Assert(dispatcher != null);
this._dispatcher = dispatcher;
}
public void Invoke(Action action)
{
Debug.Assert(action != null);
this._dispatcher.Invoke(action);
}
public void BeginInvoke(Action action)
{
Debug.Assert(action != null);
this._dispatcher.BeginInvoke(action);
}
}
関連
-
[解決済み] ファイル *.mdf をデータベースとして添付できません。
-
[解決済み] WCF エラーの解決。このサービスのメタデータパブリッシングは現在無効になっています。
-
[解決済み] LINQ to Entitiesはメソッドを認識しません。
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] enumを列挙するには
-
[解決済み] C#の正しいバージョン番号を教えてください。
-
[解決済み] usingディレクティブはネームスペースの内側と外側のどちらを使うべきですか?
-
[解決済み] DateTime型の誕生日から年齢を計算するにはどうしたらいいですか?
-
[解決済み】KnockOutJS - 複数のViewModelsを1つのViewで使用する場合
-
[解決済み] MVVMテンプレートの好例
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] ファイル *.mdf をデータベースとして添付できません。
-
[解決済み] Microsoft.Practices.ServiceLocationはどこから来たのですか?
-
[解決済み] リファレンスの追加にSystem.Web.Mvcが表示されないのはなぜですか?
-
[解決済み] VB.NETでファイル名を一意のサフィックスに変更するには?
-
[解決済み] "SSL/TLSセキュアチャネルの信頼関係を当局と確立できませんでした "の解決方法
-
[解決済み] 列挙型を文字列に変換する
-
[解決済み] .Any() vs .Count() > 0のどちらのメソッドがより良いパフォーマンスを発揮しますか?
-
[解決済み] RelativeSourceでWPFバインディングを使用するにはどうしたらいいですか?
-
[解決済み] MemoryStreamから文字列を取得する方法は?
-
[解決済み] WPFのStaticResourceとDynamicResourceの違いは何ですか?