如何将DataTemplate添加到资源中?

Kir*_*kov 4 wpf mvvm

我有一个类向导,它使用在同一项目中定义的页面创建向导。PageViewModel与PageView是分开的。PageViewModel是从PageViewModelBase抽象类派生的普通C#类,而PageView是UserControl。为了定义PageViewModel和PageView之间的映射,我为项目中的每个页面编写了以下代码:

 <Window.Resources>
    <DataTemplate DataType="{x:Type OurNewPageViewModel}">
      <OurNewPageView />
    </DataTemplate>
  </Window.Resources>
Run Code Online (Sandbox Code Playgroud)

现在,我想在用户代码调用向导的构造函数时向向导添加页面。这意味着将Pages View和ViewModel移到用户端。例如,为了用一页创建一个向导,用户将编写以下代码:向导usersWizard = new Wizard(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);
Run Code Online (Sandbox Code Playgroud)

其次,使用XamlReader。我可以使用它创建一个数据模板,但是我不知道如何将其附加到资源上。

ASa*_*nch 5

在创建DataTemplate的代码背后,有一些错误:

  1. “ dt.DataType = wpfView.GetType()”应为“ dt.DataType = wpfviewmodel .GetType()”
  2. 将模板添加到ResourceDictionary时,应使用DataTemplateKey。

因此,您的代码应类似于:

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);
Run Code Online (Sandbox Code Playgroud)