10

ご挨拶!MVVM ライト (素晴らしいフレームワーク) を使用することを楽しんでいます。これにより、私の生活がはるかに楽になり、克服するのが困難であることが証明されていた多くの障壁が取り除かれました....

質問:

ユーザーが相互に送信するメッセージを編集するためのカスタム ダイアログ ボックスをセットアップしようとしています。MVVM フレームワークを使用して、ChildWindow オブジェクトを使用して Silverlight カスタム ダイアログ ボックスを作成しようとしています。

これがどのように達成されるかについて何か提案があるかどうか疑問に思っていました

ここで見つけたダイアログMVVMサンプル コードに従ってください。

したがって、私が今持っている基本的な考え方は、クラスのビュー モデル (この場合は Matrix.MessageViewModel) を使用してカスタム ダイアログ ボックスのインスタンスを作成し、Messenger.Send<> を介して送信し、登録されたメッセージを処理することです。ダイアログを表示するビューを作成し、ChildWindow ダイアログ ボックスの [保存] ボタン ハンドラーで Messenger.Send を起動し、変更されたコンテンツをビューモデルの Save メソッドを使用して保存します...

少し回りくどいようです - よりクリーンな方法がないことを確認したかったのです....

関連するコード ビット:

ビュー モデル:

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);
}

これは、結果の MessageItem をストレージ用のモデルにルーティングする CommandTypes.MessageSave を監視する Messenger.Default.Register<> を持つ ViewModel に結び付けられます.....

4

1 に答える 1

8

それは私がやろうとしていることとかなり近いですが、私が違うことをしていることがいくつかあります。

  1. ダイアログ ビューのビュー モデルがあり、ビューのコード ビハインドではなく、メッセージング ロジックをそこに移動します。
  2. ビュー モデルで Save コマンドを使用し、ButtonSave をそのコマンドにバインドします。これにより、ビューの背後にあるコードではなく、保存ロジックがビュー モデルに移動します。
  3. 保存ボタンがクリックされたときに別のメッセージを使用しています。また、DialogMessage のコールバックを使用していません。Save コマンドを使用するように変更すると、メッセージをビュー モデルのプライベート メンバーに保存し、ユーザーが保存するときにメッセージのコールバックを使用できます。
  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();
    }
}
于 2010-07-27T12:50:48.320 に答える