我在这里有一个属性,它显示从组合框中选择的消息。在InitializeMessageFields方法中,我基于所选项加载数据网格。比方说我的组合框中有不同的项目。我想做的是在加载网格之前显示(在某些对话框中)所选项目,以通知用户哪些网格数据属于哪个项目。private string _selectedMessageType;
public string SelectedMessageType
{
set
{
if (_selectedMessageType == value) return;
this._selectedMessageType = value;
InitializeMessageFields();
this.NotifyPropertyChanged("IsMessageTypeSelected");
}
get
{
MessageBox.Show("Loading ",_selectedMessageType );
return this._selectedMessageType;
}
}
我该怎么做?
直接在虚拟机中显示对话框会使测试变得困难。相反,通过负责显示消息的构造函数将服务作为依赖项传递。通过一个接口实现它,这样您就可以模拟它进行测试。
或者使用类似棱镜中的事件聚合器之类的东西。这将是我更喜欢的方法。
如果你想在vm中直接显示懒惰,那么至少添加一个布尔属性来抑制测试。
根据打开对话框的方式,您可以在视图模型中引发事件,按照Viv的建议使用服务定位器模式,也可以使用MVVMLite的Messenger(只是一些想法)。您可以从视图模型直接打开对话框,但这是不可取的,因为这会阻止您对视图模型进行单元测试或重用视图模型(可能是作为可移植类库)。
以下是msdn的一篇文章和一些示例代码,展示了如何打开wpf对话框。您可以将ViewModel传递给对话框构造函数,并设置窗口的数据上下文。
http://msdn.microsoft.com/en-us/library/aa969773.aspx#Custom_Dialog_Boxes
// Instantiate the dialog box
MarginsDialogBox dlg = new MarginsDialogBox();
// Configure the dialog box
dlg.Owner = this;
// Open the dialog box modally
dlg.ShowDialog();