如何将DataTemplate添加到资源中?

5

我有一个叫做Wizard的类,它可以创建一个向导页面,这些页面在同一个项目中定义。PageViewModel与PageView是分开的。PageViewModel是一个普通的C#类,它继承自PageViewModelBase抽象类,而PageView是一个UserControl。为了定义PageViewModel和PageView之间的映射,我为项目中每个页面编写了以下代码:

 <Window.Resources>
    <DataTemplate DataType="{x:Type OurNewPageViewModel}">
      <OurNewPageView />
    </DataTemplate>
  </Window.Resources>

现在我希望当用户调用我的向导构造函数时,可以添加页面到向导中。这意味着将页面视图和视图模型移动到用户端。例如,为了创建一个只有一页的向导,用户将编写以下代码: Wizard 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);

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

1个回答

6
在您的代码后台中创建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);

非常好!这是一个了解IOC的超级起点,具有自己的引导程序等等...谢谢 :-) - peter70

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接