![](/img/trans.png)
[英]How do I control a WPF 4.5 Ribbons contextual tab visibility by availability of a particular control within a Prism (+ MEF) view using MVVM?
[英]Dynamically generating controls in WPF using Prism, MVVM, MEF
我将WPF与Prism和MEF结合使用。 需要动态创建控件。 所以这是我的问题!!
据我所知,我不应该在我的代码中使用代码(SomeFile.xaml.cs)来保持我的代码易于测试。 因此,代码应实际移至ViewModel。
但是我的代码动态生成UI控件。 我不认为ViewModel应该知道有关控件的任何信息。
那么我应该在哪里以及如何去编写这段代码呢? 什么是正确的方法? 希望我清楚自己!
谢谢
使用WPF / MVVM时,您的数据层就是您的应用程序( DataContext ),您可以使用Templates
方式告诉WPF如何将应用程序组件绘制到UI。
例如,假设您被赋予了动态渲染一组控件的任务。
WinForms方式可能是遍历对象,为每个对象创建UI控件,然后将UI控件添加到屏幕。
但是,使用WPF / MVVM时,您可以创建一个代表每个对象的类( Model
),并为WPF提供要显示的这些类的列表。
WPF可以使用许多不同的控件来绘制对象列表,但是其中最基本的控件可能是ItemsControl 。 如果您有兴趣, 我在博客上有一些简单的ItemsControl
示例。
现在即使你给WPF提供了要渲染的对象列表,并告诉它使用什么控件来渲染列表,它仍然可能不知道如何绘制对象。 通常的解决方案是包含某种XAML模板,告诉它如何绘制对象。
这是一个简单的示例模板,用于告诉WPF如何绘制MyClassObject
类型的对象:
<DataTemplate DataType="{x:Type local:MyClassObject}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="Name:" />
<TextBox Text="{Binding Name}" />
</StackPanel>
</DataTemplate>
我希望这能帮助您朝正确的方向前进:)
从我的角度来看,视图有责任呈现viewmodel提供的数据/模型。 虽然在视图模型中保留尽可能多的模型->视图转换逻辑是理想的,但控件的创建会增加添加到视图模型的复杂性,因为可能会添加耦合或基础结构。
虽然你可以:1)让viewmodel直接访问视图,允许它直接创建控件这增加了耦合... 2)在视图上创建一个接口来操作控件这意味着必须传递视图(不是简单地绑定)到视图模型3)创建绑定到视图的控件的抽象,并基于由视图模型创建的抽象来渲染视图。这随着控件集的扩展增加了维护的噩梦。
我建议通过主视图模型上的属性公开模型(直接或包装在微视图模型中),然后通过xaml将其绑定到视图上的属性,这样,视图模型上的任何PropertyChanged都会向视图发送更新。 在视图内部使用模型信息和控件创建逻辑来清除并重新创建控件,并将模型动态绑定到您创建的控件。 这将简化控件的创建和绑定,并且您无需练习任何伏都教即可将输入到控件中的信息返回到模型中。
请注意,即使您创建了一个中间类(附加的行为,装饰器或其他),它仍将需要能够直接访问视图的控件结构以将生成的控件附加到可视树,这可能会导致其他问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.