wpf mvvm - как отправить сообщение только родителю? - PullRequest
0 голосов
/ 26 августа 2010

Я создаю свое первое приложение, используя MVVM, и я застрял.Использование мессенджера для сообщения другим моделям представления о некоторых изменениях работало нормально, пока я не попытался создать наблюдаемую коллекцию объектов.У меня есть класс (myClass), который содержит список (innerList).Элементы innerLists должны отправить сообщение своему родителю (чтобы сообщить, что они изменились или должны быть удалены).Я отправляю сообщение от объекта innerList.Это сообщение зарегистрировано в myClass.

Проблема в том, что мне нужно создать ObservableCollection объектов myClass.Как я понимаю идею отправки-получения сообщений, каждый экземпляр myClass будет получать сообщение, отправленное из элемента innerList.Цель состоит в том, чтобы иметь возможность получать сообщение только в родительском объекте myClass, а не в каждом объекте myClass.

Структура, которую я описал, намного сложнее, так что это всего лишь набросок ситуации.Вопрос - можно ли отправить сообщение только родительскому объекту с помощью функции Messenger Send Register.Может быть, это нужно решить каким-то другим способом?

Ниже показано, как строятся два класса.Я сократил это только до того, что здесь важно.

public class ObjTypeListVM : ViewModelBase
{
    private ObservableCollection<ObjTypeVM> objTypeList = new ObservableCollection<ObjTypeVM>();

    public ObjTypeListVM()
    {
        Messenger.Default.Register<Messages.ObjTypeModifiedMsg>(this, ObjTypeModified);
    }

    public ObservableCollection<ObjTypeVM> ObjTypeList
    {
        get { return objTypeList; }
    }

    public void ObjTypeModified(Messages.ObjTypeModifiedMsg msg)
    { 
        switch (msg.Type)
        {...

            case "delete":
                Delete(msg.ObjType);
                break;
            default:
                break;
        }
    }
    public void Delete(ObjTypeVM objType)
    {...
        ObjTypeList.Remove(objType);
    }
}


public class ObjTypeVM : ViewModelBase
{
    private XmlSTSLib.ObjType objType;
    int objTypeId;

    private RelayCommand deleteItemCmd;

    public ObjTypeVM(ObjType _objType, int _objTypeId)
    { ... }


    public int ObjTypeId
    {
        get { return this.objTypeId; }
        set { this.objTypeId = value; RaisePropertyChanged("ObjTypeId"); }
    }


    public RelayCommand DeleteItemCmd
    { 
        get
        {
            if (deleteItemCmd == null)
            {
                deleteItemCmd = new RelayCommand(Delete);
            }
            return deleteItemCmd;
        }
    }

    public void Delete()
    {
        Messenger.Default.Send<Messages.ObjTypeModifiedMsg>(new Messages.ObjTypeModifiedMsg(this, "delete"));
    }
}

1 Ответ

1 голос
/ 26 августа 2010

Предполагая, что вы используете MVVM-Light от Galasoft (только предположение; P), есть несколько способов.

Один, назначив токен, который известен обоим объектам, и отправив сообщение вместе с этим токеном. Только получатели, которые зарегистрировались с этим токеном, получат сообщение.

Два, укажите свойство Target объекта сообщения и попросите получателей проверить его. Все зарегистрированные получатели получат сообщение, но они могут выбрать, хотят ли они реагировать или нет, на основе свойства Target сообщения.

Хорошая работа по использованию системы обмена сообщениями, она потрясающая;)

...