использование средства рассылки светового сигнала MVVM с диалоговым классом Silverlight 4 ChildWindow

Поздравления! Люблю использовать световой сигнал MVVM - большая платформа - сделала мою жизнь намного легче, и сняла много барьеров, которые оказывались трудными преодолеть....

Вопрос:

Я пытаюсь установить пользовательское диалоговое окно для редактирования пользователей сообщений, отправляют друг другу. Я пытаюсь создать Silverlight пользовательское диалоговое окно с помощью объекта ChildWindow использование платформы MVVM.

Задавался вопросом, были ли какие-либо предложения относительно того, как это могло бы быть выполнено

После диалогового примера кода MVVM я нашел здесь: http://mvvmlight.codeplex.com/Thread/View.aspx?ThreadId=209338 я застрял, потому что диалоговый объект ChildWindow в Silverlight асинхронен, и имеет другой класс Результата.

Таким образом - Общее представление, которое я имею теперь, использует модель представления класса (в этом случае Матрица. MessageViewModel) для создания экземпляра пользовательского диалогового окна отправьте его через Messenger. Отправьте <>, обработайте зарегистрированное сообщение в представлении для отображения диалогового окна, затем имейте огонь обработчика кнопок Save диалогового окна ChildWindow Messenger. Отправьте с измененным содержанием, который затем хранится с помощью метода Сохранения на viewmodel...

Кажется, что немного кольца - так хотело удостовериться, что не было более чистого пути....

Биты соответствующих норм:

модель представления:

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(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(
        this.MessageItem, CommandMessages.MessageTypes.MessageSave);
}

Это скрепляет в ViewModel, который имеет Messenger. Значение по умолчанию. Регистр <> наблюдающий за CommandTypes. MessageSave, который направляет получающийся MessageItem к модели для устройства хранения данных.....

10
задан Jacob 27 July 2010 в 03:30
поделиться

1 ответ

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

  1. У меня была бы модель представления для моего диалогового представления, и я переместил бы в нее логику обмена сообщениями, а не код представления.
  2. Я бы использовал команду «Сохранить» в моей модели представления и привязал ButtonSave к этой команде. Это перемещает логику сохранения в модель представления вместо кода, стоящего за вашим представлением.
  3. При нажатии кнопки сохранения вы используете другое сообщение. Кроме того, вы не используете обратный вызов DialogMessage. Предполагая, что вы перейдете на использование команды «Сохранить», вы можете сохранить сообщение в закрытом члене модели представления, а затем использовать обратный вызов сообщения при сохранении пользователем.
  4. Вы можете подумать о повторном использовании диалогового представления или о том, чтобы убедиться, что представление очищается правильно, чтобы не произошло утечки памяти.

Вот изменения, которые я бы внес в вашу модель представления, следуя предложениям 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();
    }
}
8
ответ дан 4 December 2019 в 02:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: