我有一个类向导,它创建一个向导,其中包含在同一个项目中定义的页面。 PageViewModel与PageView分开。 PageViewModel是从PageViewModelBase抽象类派生的普通C#类,PageView是UserControl。为了定义PageViewModel和PageView之间的映射,我为项目中的每个页面编写了以下代码:
<Window.Resources>
<DataTemplate DataType="{x:Type OurNewPageViewModel}">
<OurNewPageView />
</DataTemplate>
</Window.Resources>
现在,当用户的代码调用Wizard的构造函数时,我想向向导添加页面。这意味着将Pages View和ViewModel移动到用户端。例如,为了创建一个页面的向导,用户将编写以下代码: 向导用户向导=新向导(new usersViewModel(),new userView()); 问题是我不知道如何在我的构造函数中提供viewModel和View之间的映射。据我所知,我可以使用两种不同的方法来解决这个问题。首先,要使用FrameworkElementFactory,但以下代码不起作用:
//let we have WelcomePageView wpview and WelcomePageViewModel wpviewmodel
FrameworkElementFactory fef = new FrameworkElementFactory(wpview.GetType());
DataTemplate dt = new DataTemplate();
dt.DataType = wpview.GetType();
dt.VisualTree = fef;
base.Resources.Add(wpviewmodel.GetType(), dt);
其次,使用XamlReader。我可以使用它创建数据模板,但我不知道如何将它附加到资源。
答案 0 :(得分:3)
在你的代码隐藏中创建DataTemplate,有几个错误:
所以你的代码应该是这样的:
DataTemplate dt = new DataTemplate();
dt.DataType = typeof(PageViewModel);
FrameworkElementFactory fef = new FrameworkElementFactory(typeof(PageView));
dt.VisualTree = fef;
DataTemplateKey dtKey = new DataTemplateKey(typeof(PageViewModel));
this.Resources.Add(dtKey, dt);