異なるクラスから複数のフォームに更新イベントを送信する-WPF

mkautzm

構造

更新をかなり定期的にチェックするタイマーを起動する単純なフォームがあります。ロード時に開始するフォームのコンストラクターは次のようになります。

public MainWindow()
    {
        InitializeComponent();
        otherWindow = new TheOtherWindow();

        if (Meta.hasUpdate)
        {
            updateImage.Source = new BitmapImage(new Uri("/MyProject;component/Images/updateTrue.gif", UriKind.Relative));
        }

        Thread updateMonitor = new Thread(() =>
        {
            UpdateManager updater = new UpdateManager();
            updater.StartUpdateMonitor();
        });

        updateMonitor.IsBackground = true;
        updateMonitor.Start();
    }

Metaクラスには、いくつかの非常に基本的な情報が含まれており、いくつかの場所で参照されているが、更新されることもあるさまざまな文字列が格納されています。その構造の中にはこれがあります:

class Meta
{
    ...
    private static bool hasUpdate = false;

    public static bool GetHasUpdate()
    {
        return hasUpdate;
    }

    public static void SetHasUpdate(bool value)
    { 
        hasUpdate = value;
    }
}

もう1つはUpdateManagerクラスです。これには、5分ごとに更新をチェックするための小さなルーチンが含まれています。

class UpdateManager
{
    Timer timer;

    public void CheckForUpdates(Object source, ElapsedEventArgs e)
    {

        if (!isUpToDate())
        {
            timer.Stop();
            Meta.SetHasUpdate(true);

            Application.Current.Dispatcher.Invoke(new Action(() =>
            {
                MessageBox.Show("A new update is now available!);
            }));
        }
    }

    public void StartUpdateMonitor()
    {
        float updateInterval = 300000;

        timer = new Timer(updateInterval); // Milliseconds between checks.

        timer.Elapsed += CheckForUpdates;
        timer.AutoReset = true;
        timer.Enabled = true;
    }
}

問題

つまり、Meta.SetHasUpdate()に到達するたびにイベントを発生させ、小さなアイコンを変更して更新が利用可能であることを示すことを目的として、これをアプリケーション内のすべてのフォームにブロードキャストします。

私の試みは、INotifyPropertyChangedの実装が静的メンバーではうまく機能しないことを知って終了しました。これはそれを実装するための私の試みでした...

class Meta : INotifyPropertyChanged

{
    ...
    private static bool hasUpdate = true;

    public static bool GetHasUpdate()
    {
        return hasUpdate;
    }

    public static void SetHasUpdate(bool value)
    { 
        hasUpdate = value;
        NotifyPropertyChanged();
    }

    private static void NotifyPropertyChanged()
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(null, new PropertyChangedEventArgs("hasUpdate"));
        }
    }
}

これらのメンバーは複数のフォームから読み戻す必要があるため、オブジェクトをたくさん回さずに静的にしないことはできません。これはやりたくないことです。

この場合、複数のフォームがMetaクラスから受信できるイベントをどのように発生させますか?別の構造を検討する必要がありますか、それともINotifyPropertyChangedを誤解していますか?

浮く

これを解決する方法はたくさんありますが(メタクラスのDIを各ページのViewModelに入れて、INPCに反応することを考えてください。シングルトンアプローチよりも優先されます)、考慮すべき1つのアプローチは、イベントではなくメッセージングを使用することです。メッセージ(ほとんどのMVVMフレームワークで提供されます)は、緩く結合されたコンポーネント間で通信するための優れた方法です。MVVM LightのようなMVVMライブラリを活用する場合、Messengerの実装が含まれているため、これは非常に簡単です。このアプローチの主な利点は、イベントベースのアプローチの場合のように、通知を受け取りたいフォームが必ずしもソースの参照を保持する必要がないことです。

関心のあるすべてのフォームにメッセージを登録してもらい、受信時にそれに応じて対応するだけです。

たとえば、MVVM Lightを使用すると、INPCプロパティが更新されたときにメッセージを自動的にブロードキャストすることを利用できます。

 private bool hasUpdate;
 public bool HasUpdate
 {
    {
        return hasUpdate;
    }

    set
    {
        // the last bool param indicates whether or not to broadcast a message to all interested parties. 
        Set(nameof(HasUpdate), ref hasUpdate, value, true);
    }
}

次に、アプリの完全に別個の/無関係な部分(通常はViewModel)で、このような更新に関心があることを示すためにこれを行うことができます。

 Messenger.Default.Register<PropertyChangedMessage<bool>>(this, m => ReceiveHasUpdatedMessage(m));

次に、受信ラムダで:

 private void ReceiveHasUpdatedMessage(PropertyChangedMessage<bool> m)
 {
    // react accordingly.      
 }

これはMessenger、MVVMLightが提供する単純な使用例の1つにすぎません。ほとんど何でもできます。ここでの前提は、このアプローチを使用することで、利害関係者がエミッターへのハードリファレンスを必要としないようにすることです。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

WPFのコンボボックスアイテムごとに複数のフォントを使用するにはどうすればよいですか?

分類Dev

WPFのOnStartupイベントに相当するWindowsフォーム

分類Dev

WPF:異なるタイプのアイテムを持つ複数のレベルをTreeViewに追加します

分類Dev

バインド可能なベース WPF を使用してソースからターゲットを更新する

分類Dev

WindowsフォームからのWPFベストプラクティス

分類Dev

C#WPF-クリックイベントから他のクラスファイルに値を渡す

分類Dev

コンストラクターWPFへのパラメーターとしてインターフェイスを含むフォームを表示する

分類Dev

異なるタイプの複数のソースを持つWPFリストボックス

分類Dev

複数の TextBox に対する 1 つのイベント WPF

分類Dev

WPFフォームのキャンバスからUI要素のサイズを取得する

分類Dev

リアルタイム更新のためにイベントをwpfリストにバインドする

分類Dev

FileSystemWatcherイベント後にWpfイメージを更新する

分類Dev

Alt + TabからWPFフォームを非表示にする

分類Dev

WPFコントロールがデフォルトでプライベートにならないのはなぜですか?

分類Dev

複数のプロジェクトからの複数のリソース辞書を使用するWPF

分類Dev

ソースWPFのロストフォーカスからターゲットを更新するにはどうすればよいですか?

分類Dev

スマートフォンのように、WPFで指を持って移動しながら画像をスライドさせる

分類Dev

WPFをバインドする2つのフォーム

分類Dev

MVVM WPFプロジェクトのDataGridから複数のアイテムを選択する

分類Dev

MVVM WPFプロジェクトのDataGridから複数のアイテムを選択する

分類Dev

リストからWPFイメージを更新する

分類Dev

WPF複数のビューモデルからタブコントロールにタブアイテムを追加する

分類Dev

Windowsフォームの単体テストをWPFに移行する

分類Dev

チェックボックスへのXAML-WPFマルチバインディングが失敗する原因となるハードウェア/プラットフォームの違いは何ですか?

分類Dev

ExcelのようなボタンイベントのないWPFプログラムでテキストボックスを検証する

分類Dev

コントロールの状態の複数の更新を回避するためのメカニズムはWPFにありますか

分類Dev

ヘルパークラスからWPFバインディングを更新する方法

分類Dev

WPFのViewModelからTextBoxにフォーカスを設定する

分類Dev

別のクラスのベストプラクティスからUI要素にアクセスするWPF

Related 関連記事

  1. 1

    WPFのコンボボックスアイテムごとに複数のフォントを使用するにはどうすればよいですか?

  2. 2

    WPFのOnStartupイベントに相当するWindowsフォーム

  3. 3

    WPF:異なるタイプのアイテムを持つ複数のレベルをTreeViewに追加します

  4. 4

    バインド可能なベース WPF を使用してソースからターゲットを更新する

  5. 5

    WindowsフォームからのWPFベストプラクティス

  6. 6

    C#WPF-クリックイベントから他のクラスファイルに値を渡す

  7. 7

    コンストラクターWPFへのパラメーターとしてインターフェイスを含むフォームを表示する

  8. 8

    異なるタイプの複数のソースを持つWPFリストボックス

  9. 9

    複数の TextBox に対する 1 つのイベント WPF

  10. 10

    WPFフォームのキャンバスからUI要素のサイズを取得する

  11. 11

    リアルタイム更新のためにイベントをwpfリストにバインドする

  12. 12

    FileSystemWatcherイベント後にWpfイメージを更新する

  13. 13

    Alt + TabからWPFフォームを非表示にする

  14. 14

    WPFコントロールがデフォルトでプライベートにならないのはなぜですか?

  15. 15

    複数のプロジェクトからの複数のリソース辞書を使用するWPF

  16. 16

    ソースWPFのロストフォーカスからターゲットを更新するにはどうすればよいですか?

  17. 17

    スマートフォンのように、WPFで指を持って移動しながら画像をスライドさせる

  18. 18

    WPFをバインドする2つのフォーム

  19. 19

    MVVM WPFプロジェクトのDataGridから複数のアイテムを選択する

  20. 20

    MVVM WPFプロジェクトのDataGridから複数のアイテムを選択する

  21. 21

    リストからWPFイメージを更新する

  22. 22

    WPF複数のビューモデルからタブコントロールにタブアイテムを追加する

  23. 23

    Windowsフォームの単体テストをWPFに移行する

  24. 24

    チェックボックスへのXAML-WPFマルチバインディングが失敗する原因となるハードウェア/プラットフォームの違いは何ですか?

  25. 25

    ExcelのようなボタンイベントのないWPFプログラムでテキストボックスを検証する

  26. 26

    コントロールの状態の複数の更新を回避するためのメカニズムはWPFにありますか

  27. 27

    ヘルパークラスからWPFバインディングを更新する方法

  28. 28

    WPFのViewModelからTextBoxにフォーカスを設定する

  29. 29

    別のクラスのベストプラクティスからUI要素にアクセスするWPF

ホットタグ

アーカイブ