Открытие диалогового окна сохранения файла в MVVM с помощью OnPropertyChange - «ОК» или «Нет» - PullRequest
0 голосов
/ 09 августа 2011

Я разрабатываю приложение для рисования, в котором мне нужно сохранить мою картину. Чтобы сохранить, мне нужно показать диалог сохранения файла, так как я реализую шаблон MVVM, я не могу напрямую использовать обработчик событий. Но во время реализации я подумал о том, чтобы использовать EventChanged directoly события.

Я реализовал INotifyPropertyChanged во ViewModel, я связал все команды. В команде сохранения в ViewModel я позвонил

    OnPropertyChanged("Show Save Dialog"); // in ViewModel

и в коде позади пользовательского контроля я добавил обработчик событий как

    ViewModel.PropertyChanged += new // in code behind of user control
          System.ComponentModel.PropertyChangedEventHandler(ViewModel_PropertyChanged);

и в ViewModel_PropertyChanged у меня есть

   switch (e.PropertyName ) // in code behind of user control
        {
            case "Show Save Dialog": ShowSaveFileDialog();// this function shows dialog.
            break;
         }

Это прекрасно работает в моей ситуации, но я не знаю темной стороны этой реализации.

Это правильно ????

Ответы [ 3 ]

3 голосов
/ 09 августа 2011

Правильно?Нет правильного или неправильного, только лучший выбор в настоящее время.Единственным способом для пуристов было бы абстрагироваться от процесса получения такого ввода от пользователя за интерфейсом, а затем создать класс View, который обслуживает этот интерфейс, и каким-то образом внедрить его (IoC / DI, или, возможно, с помощью композиции в xaml, если вашМодели ViewModels создаются таким образом).

Лично я бы не стал тратить на это слишком много времени, если только вы не должны беспокоиться об этом .Я сделал это в обе стороны.Для вашего среднего MVVM-приложения, я думаю, не является большим преступлением просто использовать MessageBox, OpenFileDialog и т. Д. Для сильно протестированных приложений вам необходимо абстрагировать его.И есть и другие ситуации, которые этого требуют.Например, у меня есть код, который существует в приложении и в расширении Visual Studio.VS имеет свои собственные типы диалогов, которые следует использовать вместо, скажем, MessageBox.Так что абстракция уместна.Но я бы не стал вкладывать деньги в работу, если бы у меня не было причины.

1 голос
/ 09 августа 2011

Хорошо, как Уилл сказал, что нет правильного или неправильного ... только лучший выбор!

Лично я больше склоняюсь к пуристской стороне и пытаюсь сконструировать систему с четким разделением интересов ... но это только я!

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

Но, опять же, выберите способ, который наилучшим образом соответствует вашим потребностям / предпочтениям!

1 голос
/ 09 августа 2011

Почему бы вам просто не создать собственное событие?Примерно так в вашей ViewModel:

public event EventHandler<EventArgs> ShowSaveDialog;

, а затем используйте

ViewModel.ShowSaveDialog += OnShowSaveDialog;

private void OnShowSaveDialog(object sender, EventArgs e){
    //handle the event
}

Я бы не просто "злоупотребил" PropertyChanged таким образом.Вероятно, в вашей реализации нет ничего плохого, просто она не кажется правильной.Кроме того, вы используете магические строки, но если у вас есть пользовательское событие, оно гораздо более декларативно, и другие пользователи вашего кода сразу поймут, что есть способ подписаться на это событие.
Если вам нужно передать дополнительныезатем создайте реализацию EventArgs и добавьте нужные свойства.

...