【发布时间】:2011-04-30 19:48:33
【问题描述】:
silverlight 中是否有类似于占位符的控件? 如果我的视图模型中有一个动态创建的控件,我如何将它绑定到 Xaml 中的某个元素? 这是实现这一目标的正确方法吗:
<ContentControl Content="{Binding MyControl}"></ContentControl>
【问题讨论】:
标签: xaml mvvm silverlight-4.0 mvvm-light
silverlight 中是否有类似于占位符的控件? 如果我的视图模型中有一个动态创建的控件,我如何将它绑定到 Xaml 中的某个元素? 这是实现这一目标的正确方法吗:
<ContentControl Content="{Binding MyControl}"></ContentControl>
【问题讨论】:
标签: xaml mvvm silverlight-4.0 mvvm-light
您可以有一个占位符,根据您要显示的对象类型填充适当的子控件。例如,您可以在视图模型中绑定到Foo 类型的属性,然后视图会自动选择FooView 控件来显示该属性。请参阅此other question 和链接文章中的示例代码,了解其工作原理 - 它涉及数据模板。确保您首先了解这些内容。
从您的other question 我知道您实际上是在尝试使用 MEF 添加视图。本质上,您正在尝试使用 MEF 插件添加数据模板。这是一个更高级的用例,它是this question 的主题。该问题的答案解释了如何动态合并插件提供的资源字典(包含数据模板信息)。
【讨论】:
不要动态创建实际控件。将您需要的所有内容放在视图模型的属性中,并将 UI 绑定到这些属性。当然,您还需要将控件的 DataContext 设置为视图模型。详情请见this overview。
为了回答更多问题,请将 ContentControl 的内容绑定到 ViewModel 中的一个属性。该属性可以是 any 类型!然后在 XAML 中声明一个 DataTemplate 用于显示该属性;这将代表绑定后用于装饰该属性的“皮肤”。将 DataTemplate 设置为 ContentControl 的 ContentTemplate (或作为该类型的默认值......等)。 DataTemplate 可以包含其他控件、其他绑定、任何东西。这至少是一种的方法,有很多。您必须提出更具体的问题或开始阅读基础知识。
【讨论】: