2

私はWindowsPhone7を作成していて、MVVMを使用してそれを実行しようとしています。ビューモデルをできるだけきれいに保ちたいのですが、ダイアログボックスの作成方法がわかりません。私はMVVMライトを使用していますが、メッセージングシステムなどがあることは知っていますが、使用方法がよくわかりません。

Guide.BeginShowMessageBoxこれは標準のダイアログボックスよりも多くの機能を提供するように思われるので、使用したいと思い ます。

MVVMパターンを壊さずにこれを行うにはどうすればよいですか。ビューをロードするときに、ロードされたトリガーをトリガーして、いくつかの条件を確認したいと思います。条件が満たされた場合は、ダイアログを表示します。

// Vm

public RelayCommand MainPageLoaded
    {
        get
        {
            if (!NetworkInterface.GetIsNetworkAvailable())
            {
                // breaks MVVM now as have view code in viewmodel. Need to take out somehow
                Guide.BeginShowMessageBox("Test", "Test network", new List<string>() { "Yes", "No" }, 0, MessageBoxIcon.Warning, asyncResult =>
                    {
                        int? returned = Guide.EndShowMessageBox(asyncResult);
                        // if yes then work offline mode? Maybe another property in ViewModel will get set to say offline mode?
                    }, null);
            }
            return null;
        }
        set
        {
            // Not sure what to put here.
        }
    }

// 意見

<i:Interaction.Triggers>
    <i:EventTrigger>
        <GalaSoft_MvvmLight_Command:EventToCommand Command="{Binding MainPageLoaded}"/>
    </i:EventTrigger>
</i:Interaction.Triggers>

編集 私が抱えている別の問題はです。このプロパティに保存されているいくつかのデータにバインドされているリストがあります

   public ObservableCollection<ContactGroup> ContactGroups { get; set; }

次に、タップすると、トリガーされるリレーコマンドがあります

 public ICommand GroupContactTapped
        {
            get
            {
                return new RelayCommand<GestureEventArgs>(e =>
                {
                    var selectedTextBlock = e.OriginalSource as TextBlock;

                    MessageBox.Show(selectedTextBlock.Tag.ToString());
                });
            }
        }

しかし、ソースをテキストブロックにキャストせずに、どのオブジェクトが「タップ」されたかを見つける方法がわかりません。

4

3 に答える 3

2

メインウィンドウのように、他のすべてのビューをホストする1つのメインページ/ビューがあると仮定します。ビューモデルからメッセージイベントを送信し、ダイアログボックスはメインウィンドウの背後にあるコードで処理されます。これは私のプロジェクトの背後にある唯一のコードであるため、この1つの例外を除いて、プロジェクトの残りの部分を厳密にMVVMにすることができます。

私は次のメッセージを送信します(VBから変換されたため、作業が必要になる場合があります)。

object message = new DialogMessage("YourMessage", YourFunctionThatHandlesCallback) {
    Button = MessageBoxButton.YesNo,
    Caption = "Caption Goes Here"
};
Messenger.Default.Send(message);

メインページのコードビハインドで次のダイアログボックスに登録します。

Partial Public Class MainWindow
  Inherits Window

  Public Sub New()
    InitializeComponent()

    ''single initialization of messanger for catching message box
    Messenger.[Default].Register(Of DialogMessage)(Me, Sub(msg)
                                                           Dim result = MessageBox.Show(msg.Content, msg.Caption, msg.Button, MessageBoxImage.Warning)
                                                           ''Send callback
                                                           msg.ProcessCallback(result)
                                                       End Sub)
  End Sub
End Class

C#ラムダを正常に変換できなかったため、VBのままにする必要がありました。お役に立てれば

于 2013-03-15T01:41:46.143 に答える
2

Cimbalino Phone Windows ToolkitにはMessageBoxServiceがあります!これはMVVMアーキテクチャで使用できます。

于 2013-03-15T13:54:41.413 に答える
1

「MVVMパターン」に従うことの真の意味は、非常に主観的なものです。
たとえば、VMから(任意のタイプの)メッセージボックスを表示/起動するべきではないと言う人もいれば、これで問題ないと言う人もいます。

他のあいまいさの場合と同様に、パターンの順守と、特定のプロジェクトに最も適切なものと、コードベースを開発および保守する人々に適切なものとのバランスをとる必要があります。

MvvmLightに関しては、それが使用するメッセージングシステムは、ユーザーにメッセージを表示するためではなく、ビューモデルから別のビューモデルまたはビューのいずれかに通信するためのものです。

特にビューモデルから使用する場合Guide.BeginShowMessageBoxは、非ブロッキングであることに注意してください。「通常」のように動作させたい場合は、メッセージボックスが表示されている間はアプリとの対話を続行できないように、でMessageBox使用する必要があります。ManualResetEvent

于 2013-03-15T19:26:31.863 に答える