-1

我需要使用 ModernWindow 的 ContentSource 属性获取视图集的 DataContext,请您帮忙。我正在使用带有 Modern 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 中,因为有多个视图实例,但我想在 ViewModel 中进行其中存在“ShowPrompt()”,因为模型将与视图正确关联,因此我可以轻松地将视图映射到那里。

谢谢你。

4

1 回答 1

0

为了完成这项工作,我自己设置了ModernWindow的内容(如下面的ViewModel方法中的代码所示),而不使用ContentSource DependencyProperty,如果我们使用ContentSource属性,它将由ModernWindow设置为ModernFrame类型通过使用ModernFrame 的Source DependencyProperty ,在从ModernUI for WPF的ModernFrame类中的某个方法完成导航到该视图后,它本身创建了它的Content实例 .

    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上传了一个原型应用程序

谢谢。

于 2014-09-02T14:25:29.853 回答