0

我想控制以下过程。我想用订单保存客户。

在此处输入图像描述

1)写客户的名字,姓氏,电话 2)选择产品 3)按插入

我可以在上面使用 MVVM 做到这一点!

但是我不能 :

如何在 InsertCommand 之后显示消息框?以及如何激活 wpf 选项卡控件的第一个选项卡,也显示在网格中仅选定产品的客户订单中?

在此处输入图像描述

4

1 回答 1

2

可以想出两种我已经做到这一点的方法。

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

例如,在我目前正在处理的项目中,我们使用 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);
}

在您想要显示消息的表单中,您可以发布一个 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

编辑:刚刚注意到问题的第二部分。要激活第二个选项卡,取决于您如何创建它。TabControl 本质上是一个项目控件,因此您可以将其项目源绑定到视图模型集合,然后将 SelectedItem 绑定到 Windows 视图模型上的 ActiveTabViewModel 属性(模式=TwoWay),然后您可以将 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,它应该在那里。

然后在您的保存方法中设置 SelectedTabIndex = x ,它应该有望更改为正确的选项卡。

于 2012-10-12T10:36:41.423 回答