使用ContentSource属性检索内容集的DataContext
本文关键字:DataContext ContentSource 属性 检索 使用 | 更新日期: 2023-09-27 18:20:23
我需要使用ModernWindow的ContentSource属性来获取View集的DataContext,你能帮忙吗。我正在使用带有现代UI的MVVM框架。我需要显示另一个窗口的ViewModel代码如下,
public void ShowPrompt()
{
this.PromptWindow = ObjectFactory.GetInstance<IPromptWindowViewModel>().Window as ModernWindow;
this.PromptWindow.Owner = Application.Current.MainWindow;
this.PWPMainViewModel.PromptWindowsCollection.Add(this.PromptWindow);
// Here I need to get the DataContext of PromptWindow's Content
this.PromptWindow.Show();
}
我做了一些调试,发现通过在"OnNavigatedTo"事件中嵌入来自ModernUI的IContent接口
public void OnNavigatedTo(FirstFloor.ModernUI.Windows.Navigation.NavigationEventArgs e)
{
IPWPMainViewModel pwpMainViewModel = ObjectFactory.GetInstance<IPWPMainViewModel>();
pwpMainViewModel.PromptMainsCollection.Add(new ContentControl { Content = e.Content });
IPromptMainViewModel promptMainViewModel = ((UserControl)e.Content).DataContext as IPromptMainViewModel;
}
在这里,我可以获得ModernWindow内容的DataContext,即"IPromptMainViewModel"类型,但在这里,很难将视图映射/加载到该ModernWindow中,因为有多个视图实例,但我希望在存在"ShowPrompt()"的ViewModel中进行,因为在那里,模型将正确地与视图关联,这样我就可以轻松地将视图映射到那里。
谢谢。
为了完成这项工作,我自己设置ModernWindow的Content(如下面的代码所示,在ViewModel中的方法),而不使用ContentSourceDependencyProperty,如果我们使用ContentSource属性,则在ModernUI的ModernFrame类中的视图导航到View后,ModernWindow本身将为ModernFrame类型设置该属性,方法是使用ModernFrame的源依赖属性。
public void ShowPrompt()
{
this.PromptWindow = ObjectFactory.GetInstance<IPromptWindowViewModel>().Window as ModernWindow;
this.PromptWindow.Title = string.Concat("Control ", this.PromptOriginsEntity.PromptOriginsIdentity);
this.PromptWindow.Tag = this.PromptOriginsEntity.PromptOriginsIdentity;
this.PromptWindow.Owner = Application.Current.MainWindow;
// Store Window object in PromptWindowsCollection
this.PWPMainViewModel.PromptWindowsCollection.Add(this.PromptWindow);
this.PromptWindow.Show(); // inorder to retrieve the ModernFrame the ModernWindow is to be shown first
ModernFrame frameContent = (ModernFrame)this.PromptWindow.Template.FindName("ContentFrame", this.PromptWindow);
UserControl userControl = new UserControl { Content = GetView<IPromptViewModel>(), Tag = this.PromptOriginsEntity.PromptOriginsIdentity };
frameContent.Content = userControl;
this.PWPMainViewModel.PromptsCollection.Add(userControl);
IPromptViewModel promptViewModel = (IPromptViewModel)((IView)userControl.Content).DataContext;
promptViewModel.PromptEntity.Identity = this.PromptOriginsEntity.PromptOriginsIdentity;
}
我在上传了一个原型应用程序https://wpfmvvmsamples.codeplex.com/SourceControl/latest
谢谢。