我在这里有一个属性,显示来自组合框的选定消息。在我的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;
}
}
我该怎么做?
答案 0 :(得分:0)
根据您打开对话框的方式,您可以在视图模型中引发事件,使用Viv建议的服务定位器模式,或使用MVVMLite's Messenger(只是一些想法)。 您可以直接从视图模型中打开对话框,但这是 不可取 ,因为它会阻止您对视图模型进行单元测试或重用视图模型(可能是一个portable class library)。
以下是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();
答案 1 :(得分:0)
直接在VM中显示对话框会使测试变得困难。而是通过负责显示消息的构造函数将服务作为依赖项传递。通过接口实现它,以便您可以模拟它进行测试。
或者在棱镜中使用类似事件聚合器的东西。这将是我的首选方法。
如果你想直接在vm中显示懒惰,那么至少添加一个布尔属性来抑制测试。