Упрощение ICommand / RelayCommand в подходе MVVM - PullRequest
1 голос
/ 29 марта 2012

Я стараюсь сделать приложения, которые пишу, проще, и я предпринял некоторые шаги, чтобы сделать это, но у меня осталась интересная проблема, которая вовсе не кажется, что она будет уникальной для меня,Мне интересно, что я делаю неправильно.

У меня есть ViewModel, которая хранит коллекцию объектов модели.Представление представляет собой ListView, который отображает все объекты в коллекции.В модельных объектах есть вся логика для управления ими.Внутри строки ListView для каждого элемента у меня есть кнопка, и эта кнопка должна быть подключена для вызова метода объекта модели.

Чтобы заставить это работать, мне нужно добавить привязку команды, но кКонтекст данных родительского окна, который передает параметр объекта модели в строке, все для того, чтобы объект модели мог использоваться внутри ViewModel (контекст данных родительского окна) для вызова метода переданного объекта модели.

Это кажется намного сложнее, чем нужно.Я готов выбросить все, что я уже сделал, священных коров нет, я просто хочу, чтобы это было сделано более простым способом, который будет легко оглянуться через год и выяснить, что я делал.

Ответы [ 2 ]

0 голосов
/ 29 марта 2012

Создайте класс презентатора в вашей ViewModel для объектов модели и получите их коллекцию. Затем вместо этого вы можете указать для них свойство ICommand и передать ссылку на метод, который вы хотите вызвать, в родительском текстовом данных.

Возможно, что-то вроде следующего:

public class ModelPresenter : INotifyPropertyChanged
{
    private Model _model;

    public ModelPresenter(Model model, Action<Model> parentAction)
    {
        _model = model
        _action = parentAction;
    }

    public ICommand MyAction
    {
        get { return new RelayCommand(() => _parentAction(_model)); }
    }

    ...
}

Звучит так, как будто вы привязаны к свойствам вашей модели. Вы не должны делать это, так как это может вызвать утечку памяти, если ваши модели не поддерживают INotifyPropertyChanged (см .: http://support.microsoft.com/kb/938416/en-us).

0 голосов
/ 29 марта 2012
{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}},
    Path=DataContext.MyCommand}
...