2

我在 2 个屏幕之间发布/处理消息时遇到一个问题。

我的情况是:

  1. 信使屏,是主屏,在聊天屏上发布,都是从屏。带有来自服务器的消息的 Messenger 视图模型句柄。

  2. 聊天屏幕可以在信使屏幕上发布消息。信使视图模型在服务器上发送此消息。

Messenger 类如下所示:

 [Export("MessengerScreen", typeof(IMessengerViewModel))]
    public class MessengerViewModel : Screen, IMessengerViewModel, IInitializable<Account>, IHandle<Rp>
    {
        // ...

        [ImportingConstructor]
        public MessengerViewModel(IPokecService service, IEventAggregator eventAgg)
        {
            _eventAgg = eventAgg;
            _eventAgg.Subscribe(this);
        }


        //publish on slave screen 
        public void Publish(Rp rp)
        {
            _eventAgg.Publish(rp);
        }

        //handle msg from slave screen
        public void Handle(Rp msg)
        {
            //send to server
        }
    }

从屏类如下所示:

   [Export("ChatScreen", typeof(IChatViewModel))]
    [PartCreationPolicy(CreationPolicy.NonShared)]
    public class ChatViewModel : Screen, IInitializable<DetailData>, IHandle<Rp>
    {
        [ImportingConstructor]
        public ChatViewModel(IEventAggregator eventAgg)
        {
            _eventAgg = eventAgg;
            _eventAgg.Subscribe(this);
        }

        //publish only on messenger screen
        public void Publish(Rp rp)
        {
            _eventAgg.Publish(rp);
        }

        //show message from published from messenger
        public void Handle(Rp rp)
        {
            AddBlockToConversation(rp);
        }

        //if enter is pressed publish on messanger screen
        public void SendRp(KeyEventArgs e)
        {
            if (e.Key == Key.Enter && !string.IsNullOrEmpty(RpText))
            {
                _yourRp.Time = String.Format("{0:yyyy-MM-dd HH:mm:ss}", DateTime.Now);

                _yourRp.RpText = RpText;

                AddBlockToConversation(_yourRp);


                //publish on messanger screen
                Publish(_yourRp);
            }
        }
    }

我的问题是:

第一个问题是:

  • 我从 ChatViewModel 类中调用方法 SendRp。
  • 它在 ChatViewModel 中调用方法 void Publish(),
  • 然后是从类 MessengerViewModel 调用方法 void Handle()
  • 然后还从 ChatViewModel 类调用方法 void Handle()。

我不想在 ChatViewModel 类中调用方法 Handle()。为什么如果我从 ChatViewModel 向 MessengerViewModel 发送消息在 ChatViewModel 类中也称为方法 Handle?

我的第二个问题是:

我想仅在某些从属屏幕上从 MessengerViewModel 消息发布。

MessgerVieModel 有队列消息:{msg1, msg2, msg3, ..., msgN}

我想发布:

  • 从屏幕 #1 上的 msg1。
  • 从屏幕 #2 上的 msg2
  • ...
  • 从屏幕 #3 上的 msg3
4

1 回答 1

2

我的解决方案:我用修改类 EventAggregator 解决了我的问题。

像这样的东西:

我的每个视图模型都实现了这个接口:

public interface  IViewModelIdentity
{
    string ScreenIdentity { get; set; }
}

在甚至聚合器类的 Publish 方法中,我有这个:

 public void Publish(Rp rp)
        {

            WeakReference[] toNotify;
            lock (_subscribers)
                toNotify = _subscribers.ToArray();

            Execute.OnUIThread(() =>
            {
                Log.Info("Publishing {0}.", rp);
                var dead = new List<WeakReference>();

                foreach (var reference in toNotify)
                {
                    var target = reference.Target as IHandle<Rp>;

                    //GET ID OF SCREEN
                    var screenId = reference.Target as IViewModelIdentity;

                    //!
                    if (target != null && screenId != null)
                    {
                        if (screenId.ScreenIdentity=="screen on which we want to send a message")
                        {
                            //PUBLISH ON SCREEN
                            target.Handle(rp);
                        }
                    }
                    else if (!reference.IsAlive)
                        dead.Add(reference);
                }
                if (dead.Count > 0)
                {
                    lock (_subscribers)
                        dead.Apply(x => _subscribers.Remove(x));
                }
            });
        }
于 2010-12-26T16:35:58.027 回答