WPF数据绑定和类型转换

WPF数据绑定和类型转换,wpf,data-binding,mvvm,Wpf,Data Binding,Mvvm,我有一个关于WPF绑定和转换XAML中UI对象看到的数据类型的问题 我有一个用户控件,我想在不同的应用程序中重用。用户控件显示一个缩略图和几个文本块,以显示姓名和地址等个人统计信息。用户控件用于MVVM设计,因此它绑定到用户控件特定的ViewModel 遵循典型的MVVM设计原则,用户控件的ViewModel通常嵌入到其他ViewModel中,以构成更大的UI 用户控件视图模型期望某个类型(类)作为其绑定对象。 但是,嵌入UC虚拟机的ViewModels具有完全不同的对象模型,因此它们不能简单地

我有一个关于WPF绑定和转换XAML中UI对象看到的数据类型的问题

我有一个用户控件,我想在不同的应用程序中重用。用户控件显示一个缩略图和几个文本块,以显示姓名和地址等个人统计信息。用户控件用于MVVM设计,因此它绑定到用户控件特定的ViewModel

遵循典型的MVVM设计原则,用户控件的ViewModel通常嵌入到其他ViewModel中,以构成更大的UI

用户控件视图模型期望某个类型(类)作为其绑定对象。 但是,嵌入UC虚拟机的ViewModels具有完全不同的对象模型,因此它们不能简单地将数据传递给UC虚拟机。需要将父VM的数据模型转换为UC VM的数据模型

我的问题是:是否有一种被认可的方式来执行这种转换

我看了IValueConverter和IMultiValueConverter,它们看起来不像是要走的路

我想我需要的是父VM和嵌入式UC VM之间的一种垫片,父VM的数据被转换为UC VM所需的格式


或者,这基本上归结为我必须编写一个自定义UC VM来处理父VM提供的任何类型吗?

如果父VM是子VM的超集,通常父VM只会保留对子VM的引用。它会将该引用作为属性公开,您可以将
ContentControl
(或其他)绑定到该属性


这不会解决您的问题吗?

如果您真的想要并且需要进行类型转换,那么值转换器正是您想要使用的。也就是说,像IValueConverter这样的东西处理的转换类型通常比较简单和直接


但是,如果顶级/父级/管理用户控件需要将某些较大类型的比特和片段解析为承载其实际内容的用户控件,那么这就是该顶级控件的工作。不要全神贯注于在XAML中完成所有这些。解析您需要的内容并直接设置这些子控件属性非常好。

我同意Ken的观点,我认为他已经找到了答案。如果您有n个要传递到公共用户控件的数据配置,那么您希望该数据配置的所有者将其转换为要绑定到用户控件的公共形式

使用该控件的每个视图都有一个相应的视图模型,该视图模型以通用格式公开属性:

public class SampleViewModel {
   ...

    IUserControlData ControlData 
    { 
       get 
       {
          // Do conversion here or do it early and cache it.
       }
    }

   ...
}
然后将该属性绑定到视图中的用户控件

<common:CommonUserControl DataContext={Binding Path=ControlData} ... >


可能不是您想要的,但这是DataGrid动态列的解决方案。使用datagrid,您可以传递一个参数

谢谢,如果父虚拟机以UC虚拟机的本机格式提供数据,这将很好地工作。换句话说,是的,父VM是子VM的超集,但数据的格式完全不同。我是新手,所以你必须原谅我的无知。当你使用术语“用户控制视图模型”时,你是什么意思?用户控件使用的视图模型?