4

子 ViewModel から親にイベントを通信しようとしています。子ビューモデルのビューは、コンストラクター引数を渡すことができないと思われる別のウィンドウです。このビューのボタンは、親 ViewModel のメソッドをトリガーする必要があります。

子ビューモデル:

public ConnectViewModel(ConnectEvents connectEvents)
{
    ConnectEvents = connectEvents;
}

親ViewModel

public MainWindowViewModel()
{
    ConnectEvents connectEvents = new ConnectEvents();
    ConnectViewModel = new ConnectViewModel(connectEvents);
    connectEvents.ThrowEvent += ConnectToServer;
}

これら2つの間でどのように通信できますか? より良いシステムはありますか? または、親が子供にサブスクライブできるようにするにはどうすればよいですか?

4

4 に答える 4

8

あなたにはたくさんの選択肢があります。カスタム イベントを使用したり、デリゲートを直接使用したり、通常のサブスクリプションまたはWeak Event Patternを使用して、親 ViewModel でPropertyChangedまたはCollectionChangedイベントにサブスクライブしたりできます。

退会する必要がないので、私は最後のものを好みます。

于 2013-10-10T04:44:57.517 に答える
7

独自の EventAggregator を作成できます

public static class DumbAggregator
{
  public static void BroadCast(string message)
  {
   if (OnMessageTransmitted != null)
       OnMessageTransmitted(message);
  }

 public static Action<string> OnMessageTransmitted;
}

使用法:

  public class MySender
  {
    public void SendMessage()
    {
      DumbAggregator.BroadCast("Hello There!");
    }
  }

public class MySubscriber
{
  public MySubscriber()
  {
   DumbAggregator.OnMessageTransmitted += OnMessageReceived;
  }

 private void OnMessageReceived(string message)
 {
  MessageBox.Show("I Received a Message! - " + message);
 }
}

これを使用して、ビューモデルと通信できます

于 2013-10-10T04:43:31.307 に答える
0

これは、受け入れられた回答で言及されているWeakEventManagerを利用する例です。

namespace Stuff {
    using System;
    using System.Windows;

    // An "event bus" public to all view models.
    public sealed class Events {
        public static Events Instance { get; } = new Events();

        public event EventHandler<EventArgs>? SomethingHappend;

        private Events() { }

        public static void RaiseSomethingHappend(object? sender = null)
            => Instance.SomethingHappend?.Invoke(sender ?? Instance, EventArgs.Empty);
    }

    // A view model that wants to listen to one or more events.
    public class Listener {
        public Listener() {
            WeakEventManager<Events, EventArgs>.AddHandler(
                source: Events.Instance,
                eventName: nameof(Events.SomethingHappend),
                Handle);
        }

        private void Handle(object? sender, EventArgs args) { }
    }

    // A view model that raises events.
    public class Source {
        public void Foo() {
            Events.RaiseSomethingHappend();
        }
    }
}
于 2021-03-28T11:32:33.470 に答える