我有一个关于WPF绑定和转换XAML中UI对象所看到的数据类型的问题。
我有一个用户控件,我想在不同的应用程序中重用。用户控件显示缩略图图像和几个TextBlock以显示人员统计信息,例如姓名和地址。用户控件用于MVVM设计,因此它绑定到特定于用户控件的ViewModel。
遵循典型的MVVM设计原则,用户控件的ViewModel通常嵌入在其他ViewModel中,以构成更大的UI。
用户控件视图模型需要某种类型(类)作为其绑定对象。 但是,嵌入式UC的VM中的ViewModel具有完全不同的对象模型,因此它们不能简单地将其数据传递给UC的VM。需要将父VM的数据模型转换为UC VM的数据模型。
我的问题是:是否有制裁方式进行此转换?
我查看了IValueConverter和IMultiValueConverter,这些看起来不太像。
我想我需要的是父虚拟机和嵌入式UC虚拟机之间的一种填充,其中父虚拟机的数据被转换为UC虚拟机所需的格式。
或者,它是否基本上归结为我必须编写一个自定义UC VM来处理父VM提供的任何类型?
答案 0 :(得分:2)
我同意肯,我认为他有答案。如果您要将许多数据配置传递到公共用户控件,那么您希望该数据配置的所有者将其转换为公共表单以绑定到用户控件。
使用该控件的每个视图都有一个相应的视图模型,该模型以通用格式公开属性:
public class SampleViewModel {
...
IUserControlData ControlData
{
get
{
// Do conversion here or do it early and cache it.
}
}
...
}
然后,您将该属性绑定到视图中的用户控件
<common:CommonUserControl DataContext={Binding Path=ControlData} ... >
答案 1 :(得分:1)
如果父VM是子VM的超集,则通常父VM将仅保留对子VM的引用。它会将该引用公开为属性,您可以将ContentControl
(或其他)绑定到该属性。
这不能解决你的问题吗?
答案 2 :(得分:0)
如果您真的想要并且需要进行类型转换,则值转换器正是您想要使用的。也就是说,通常由IValueConverter之类的东西处理的转换类型相对简单直接。
但是,如果您的顶级/父级/管理用户控件需要将某些较大类型的位和部分解析为托管其实际内容的用户控件,那么这就是该顶级控件的工作。不要在XAML中完成所有这些操作。解析你需要的东西并直接设置这些子控件属性是完全可以的。
答案 3 :(得分:0)
可能不是您要找的东西,但这是DataGrid动态列的解决方案。使用datagrid,您可以传递参数。 http://www.codeproject.com/Articles/36496/Binding-a-Silverlight-DataGrid-to-dynamic-data-Part-2-editable-data-and-INotifyPropertyChanged.aspx