我在我的应用程序中使用带有Prism和MEF的WPF。需要动态创建控件。所以这是我的问题!!
据我所知,我不应该在我的代码中使用代码(SomeFile.xaml.cs)来保持我的代码易于测试。因此代码应该实际移到ViewModel。
但我的代码动态生成UI控件。而且我不认为ViewModel应该对控件有所了解。
那么我应该在哪里以及如何编写这段代码?什么是正确的方法? 希望我明白了!
由于
答案 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将输入控件的信息返回到模型中。
请注意,即使您创建了一个中间类(附加行为,装饰器或其他内容),它仍然需要能够直接访问视图的控件结构,以将生成的控件附加到可视树,这可能是引起其他问题。