0

以下のプロセスを制御したい。注文で顧客を救いたい。

ここに画像の説明を入力

1) 顧客の名前、姓、電話番号を書きます 2) 製品を選択します 3) 挿入を押します

MVVMで上記のことができます!

でもできないんです :

InsertCommandの後にメッセージボックスを表示するには? およびwpfタブコントロールの最初のタブをアクティブにする方法は、グリッドのみの選択された製品の顧客注文にも表示されますか?

ここに画像の説明を入力

4

1 に答える 1

2

頭のてっぺんからそれを行った2つの方法を考えることができます。

1 つの方法は、フォームにメッセージを含むコントロールを配置することです。通常、可視性は折りたたまれていますが、保存プロセスの一部として、可視性が可視になるようにバインドされているプロパティを設定します。コントロールは、[OK] ボタンをクリックするまで表示され、[OK] ボタンをクリックすると非表示になります。これは、小さなソリューションの場合は簡単な方法ですが、より大きなソリューションがある場合は、より頻繁にダイアログが必要になるため、より拡張可能なソリューションが必要になるため、ダイアログ サービスをビュー モデルに挿入できます。または、メッセージングを使用して、ウィンドウに表示するダイアログ コントロールを取得します。

たとえば、私が現在取り組んでいるプロジェクトでは、mvvm light を使用しており、子ウィンドウを持つメイン ウィンドウが 1 つあります。メイン ウィンドウはダイアログ メッセージを登録し、子ウィンドウがそのメッセージをパブリッシュすると、ダイアログが表示されます。例:

            public MainPage()
    {
        this.InitializeComponent();

        // http://mvvmlight.codeplex.com/discussions/209338?ProjectName=mvvmlight
        Messenger.Default.Register<DialogMessage>(this, OnDialogMessage);

    }


private static void OnDialogMessage(DialogMessage message)
{
    MessageBoxResult result = MessageBox.Show(message.Content, message.Caption, message.Button);
    message.ProcessCallback(result);
}

メッセージを表示したいフォームで DialogMessage を発行すると、そのメッセージを購読しているウィンドウに表示されます。現在、メッセージ ボックス サービスの検索を処理するために ServiceLocator を使用していますが、プロジェクトによっては、これを挿入する方が望ましい場合があります。

ServiceLocator.Current.GetInstance<IMessageBoxDisplayer>().Show(
                        "Selected Product has been saved", "Product Saved", false);

次に、 messageBoxDisplayer は、メッセージを公開してメッセージ ボックスを表示します。

    public Task<bool> Show(string messageBoxText, string caption, bool displayCancelButton)
    {
        if (caption == null)
        {
            throw new ArgumentNullException("caption");
        }

        var tcs = new TaskCompletionSource<bool>();

        var message = new DialogMessage(messageBoxText, mbr => tcs.SetResult(mbr == MessageBoxResult.OK))
            {
                Button = displayCancelButton ? MessageBoxButton.OKCancel : MessageBoxButton.OK,
                Caption = caption,
            };
        Messenger.Default.Send(message);

        return tcs.Task;
    }

明らかに、メッセージング サービスやサービス ロケータなどを実装するには、これよりも多くのコードが必要ですが、これにより、いくつかの可能な方法の一般的な要点が得られるはずです。すでにフレームワークを使用している場合は、調査する価値がないとしても、これの多くが整っている可能性があります。

mvvmlight のダイアログ メッセージとダイアログ ボックスに関するこのディスカッションを確認してください: http://mvvmlight.codeplex.com/discussions/209338?ProjectName=mvvmlight

編集:質問の2番目の部分に気づきました。2 番目のタブを有効にする方法は、作成方法によって異なります。TabControl は基本的に項目コントロールであるため、その項目ソースをビューモデルのコレクションにバインドし、SelectedItem を Windows ビューモデル (Mode=TwoWay) の ActiveTabViewModel プロパティにバインドすると、ActiveTabViewModel を必要なものに設定できます。そしてそれは変わるべきです。または、おそらく SelectedIndex をバインドできると思います(ただし、まだこの方法で試したことはありません)。

<TabControl SelectedIndex="{Binding SelectedTabIndex, Mode=TwoWay}"/>

ビュー モデルには次のプロパティがあります。 public int SelectedTabIndex { get { return _selectedTabIndex; }

        set
        {
            this._selectedTabIndex = value;
            this.RaisePropertyChanged(() => this.SelectedTabIndex);
        }
    }

NotifyPropertyChanged を処理する RaisePropertyChanged イベントがあると仮定します - mvvmlight を使用している場合、これはそこにあるはずです。

次に、save メソッドで SelectedTabIndex = x を設定すると、正しいタブに変更されるはずです。

于 2012-10-12T10:36:41.423 に答える