使用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中进行,因为在那里,模型将正确地与视图关联,这样我就可以轻松地将视图映射到那里。

谢谢。

使用ContentSource属性检索内容集的DataContext

为了完成这项工作,我自己设置ModernWindowContent(如下面的代码所示,在ViewModel中的方法),而不使用ContentSourceDependencyProperty,如果我们使用ContentSource属性,则在ModernUIModernFrame类中的视图导航到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

谢谢。