我想控制以下过程。我想用订单保存客户。
1)写客户的名字,姓氏,电话 2)选择产品 3)按插入
我可以在上面使用 MVVM 做到这一点!
但是我不能 :
如何在 InsertCommand 之后显示消息框?以及如何激活 wpf 选项卡控件的第一个选项卡,也显示在网格中仅选定产品的客户订单中?
我想控制以下过程。我想用订单保存客户。
1)写客户的名字,姓氏,电话 2)选择产品 3)按插入
我可以在上面使用 MVVM 做到这一点!
但是我不能 :
如何在 InsertCommand 之后显示消息框?以及如何激活 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);
}
在您想要显示消息的表单中,您可以发布一个 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 ,它应该有望更改为正确的选项卡。