使用Prism,MVVM,MEF在WPF中动态生成控件

时间:2014-01-02 17:13:02

标签: c# wpf mvvm prism mef

我在我的应用程序中使用带有Prism和MEF的WPF。需要动态创建控件。所以这是我的问题!!

据我所知,我不应该在我的代码中使用代码(SomeFile.xaml.cs)来保持我的代码易于测试。因此代码应该实际移到ViewModel。

但我的代码动态生成UI控件。而且我不认为ViewModel应该对控件有所了解。

那么我应该在哪里以及如何编写这段代码?什么是正确的方法? 希望我明白了!

由于

2 个答案:

答案 0 :(得分:7)

使用WPF / MVVM时,您的数据层是您的应用程序(DataContext),您可以使用Templates之类的内容告诉WPF如何将应用程序组件绘制到UI中。

例如,假设您被赋予了动态渲染一组控件的任务。

WinForms方式可能是循环访问对象,为每个对象创建UI控件,然后将UI控件添加到屏幕。

但是对于WPF / MVVM,您将创建一个表示每个对象的类(Model),并为WPF提供要显示的类的列表。

WPF可以使用许多不同的控件来绘制对象列表,但其中最基本的可能是ItemsControl。如果您有兴趣,我会在my blog上提供一些简单的ItemsControl示例。

现在即使您已经为WPF提供了要渲染的对象列表,并告诉它使用什么控件来渲染列表,它仍然可能不知道如何绘制对象。通常的解决方案是包含某种XAML模板,告诉它如何绘制对象。

这是一个简单的示例模板,用于告诉WPF如何绘制MyClassObject类型的对象:

<DataTemplate DataType="{x:Type local:MyClassObject}">
    <StackPanel Orientation="Horizontal">
        <TextBlock Text="Name:" />
        <TextBox Text="{Binding Name}" />
    </StackPanel>
</DataTemplate>

我希望这有助于您朝着正确的方向前进:)

答案 1 :(得分:0)

从我的角度来看,视图有责任呈现viewmodel提供的数据/模型。尽管在视图模型中保留尽可能多的模型 - 视图转换逻辑是理想的,但由于可以添加的耦合或基础结构,控件的创建会增加移动到视图模型的显着复杂性。

虽然你可以: 1)让viewmodel直接访问视图,允许它直接创建控件    这增加了耦合...... 2)在视图上创建一个界面来操纵控件    这意味着视图必须传递(而不是简单地绑定)到viewmodel 3)创建绑定到视图的控件抽象,并根据viewmodel创建的抽象创建视图    随着控件集的扩展,这会增加维护噩梦。

我建议通过主视图模型上的属性公开模型(直接或包装在微视图模型中),并通过xaml将其绑定到视图上的属性,这样viewmodel上的任何PropertyChanged都会发送更新到风景。在视图中使用模型信息和控件创建逻辑来清除和重新创建控件,并将模型动态绑定到您创建的控件。这将简化控件的创建和绑定,您不必练习任何voodoo将输入控件的信息返回到模型中。

请注意,即使您创建了一个中间类(附加行为,装饰器或其他内容),它仍然需要能够直接访问视图的控件结构,以将生成的控件附加到可视树,这可能是引起其他问题。