С помощью MVVM light messenger с диалоговым классом Silverlight 4 ChildWindow
Привет! Я наслаждаюсь использованием MVVM light -great framework - сделал мою жизнь намного проще и устранил ряд препятствий, которые трудно преодолеть....
Вопрос:
Я пытаюсь настроить настраиваемое диалоговое окно для редактирования сообщений, отправляемых пользователями друг другу. Я пытаюсь построить специальное диалоговое окно Silverlight, используя объект ChildWindow с использованием среды MVVM.
Интересно, были ли какие-либо предложения относительно того, как это может быть выполнено?
Следуя образцу кода MVVM диалогового окна, я нашел здесь: http://mvvmlight.codeplex.com/Thread/View.aspx?ThreadId=209338 Я застрял, потому что диалоговое окно ChildWindow в Silverlight является асинхронным, и имеет другой класс результатов.
Итак. Основная идея, которую я сейчас имею, - использовать модель представления класса (в данном случае Matrix.MessageViewModel) для создания экземпляра настраиваемого диалогового окна, отправить его через Messenger.Send < > , обработать зарегистрированное сообщение в представлении для отображения диалогового окна, а затем диалоговое окно ChildWindow. Сохраните кнопку "Сохранить". Пропустите Messenger.Send с измененным содержимым, которое затем сохраняется с помощью метода "Сохранить" в режиме просмотра...
Кажется немного кругом - так хотелось убедиться, что не было более чистого пути....
Соответствующие биты кода:
модель просмотра:
messageDialogBox = new MessageEditorDialog(
selectedMessage, this.SelectedSiteId, this.LoggedOnEmployee.Id, this.Projects);
DialogMessage editMessage = new DialogMessage(
this, messageDialogBox,"Edit Message", DialogMessageCallback);
Messenger.Default.Send(editMessage);
Вид:
public ViewHost()
{
InitializeComponent();
Loaded += new RoutedEventHandler(ViewHost_Loaded);
if (!ViewModelBase.IsInDesignModeStatic)
{
// Use MEF To load the View Model
CompositionInitializer.SatisfyImports(this);
}
ApplicationMessages.IsBusyMessage.Register(this, OnIsBusyChange);
Messenger.Default.Register<DialogMessage>(this, msg => ShowDialog(msg));
}
private void ShowDialog(DialogMessage msg)
{
MessageEditorDialog myDialog = (MessageEditorDialog) msg.Target;
myDialog.Show();
}
Диалог Сохранить:
private void ButtonSave_Click(object sender, RoutedEventArgs e)
{
Messenger.Default.Send<Message>(
this.MessageItem, CommandMessages.MessageTypes.MessageSave);
}
Это связано с ViewModel, который имеет Messenger.Default.Register < > наблюдение за CommandTypes.MessageSave, который направляет результирующий MessageItem к модели для хранения.....
Ответы
Ответ 1
Это довольно чертовски близко к тому, что я буду делать, кроме нескольких вещей, которые я делаю по-другому.
- У меня была бы модель представления для моего диалогового окна и переместить логику обмена сообщениями, а не код представления.
- Я бы использовал команду Save в моей модели представления и привязал ButtonSave к этой команде. Это перемещает логику сохранения в модель представления вместо кода, стоящего за вашим представлением.
- При нажатии кнопки сохранения вы используете другое сообщение. Кроме того, вы не используете обратный вызов DialogMessage. Предполагая, что вы измените использование команды "Сохранить", вы можете сохранить сообщение в частном члене в модели представления, а затем использовать обратный вызов сообщения, когда пользователь сохраняет.
- Возможно, вам захочется подумать о повторном использовании диалогового окна или убедиться, что представление очищено правильно, чтобы вы не закончили утечку памяти.
Вот изменения, которые я внес бы в вашу модель просмотра после предложений 2 и 3.
public class MessageEditorDialogViewModel : ViewModelBase
{
private DialogMessage _dialogMessage;
public RelayCommand SaveCommand { get; private set; }
public DialogMessage Message { get; set; }
public MessageEditorDialogViewModel()
{
SaveCommand = new RelayCommand(SaveCommandExecute);
}
private SaveCommandExecute()
{
Message.Execute();
}
}