.net 如何从VM管理表单控件?

.net 如何从VM管理表单控件?,.net,wpf,design-patterns,mvvm,.net,Wpf,Design Patterns,Mvvm,我想控制下面的过程。我想用订单保存一个客户 1) 写下客户的姓名、姓氏、电话 2) 精选产品 3) 压入 İ可以用MVVM实现上述功能 但我不能: 插入命令后如何显示messagebox?以及如何激活wpf选项卡控件的第一个选项卡,也显示在客户订单中仅网格中选定的产品 我可以想出两种方法,我可以在头脑中立即做到这一点 一种方法是在包含消息的窗体上有一个控件。通常,它的可见性是折叠的,但作为保存过程的一部分,您可以设置属性,将其可见性绑定为可见。控件将变为可见,直到单击“确定”按钮,此时它将变为

我想控制下面的过程。我想用订单保存一个客户

1) 写下客户的姓名、姓氏、电话 2) 精选产品 3) 压入

İ可以用MVVM实现上述功能

但我不能:

插入命令后如何显示messagebox?以及如何激活wpf选项卡控件的第一个选项卡,也显示在客户订单中仅网格中选定的产品


我可以想出两种方法,我可以在头脑中立即做到这一点

一种方法是在包含消息的窗体上有一个控件。通常,它的可见性是折叠的,但作为保存过程的一部分,您可以设置属性,将其可见性绑定为可见。控件将变为可见,直到单击“确定”按钮,此时它将变为不可见。 对于小型解决方案,这是一种快速简便的方法,但如果您有一个更大的解决方案,那么您将更经常地需要对话框-因此您将需要一个更可扩展的解决方案-这样您就可以将对话框服务注入视图模型,或者使用消息传递在窗口上获得一个对话框控件来显示

例如,在我目前正在进行的项目中,我们使用mvvm light,并且有一个带有子窗口的主窗口。主窗口注册对话框消息,当子窗口发布该消息时,它显示对话框。例如:

            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);
}
假设您有一个RaisePropertyChanged事件,该事件处理NotifyPropertyChanged-如果您使用的是mvvmlight,则应该存在该事件

然后在您的保存方法集中选择了edTabindex=x,希望它会更改为正确的选项卡

ServiceLocator.Current.GetInstance<IMessageBoxDisplayer>().Show(
                        "Selected Product has been saved", "Product Saved", false);
    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;
    }
<TabControl SelectedIndex="{Binding SelectedTabIndex, Mode=TwoWay}"/>
        set
        {
            this._selectedTabIndex = value;
            this.RaisePropertyChanged(() => this.SelectedTabIndex);
        }
    }