WPF数据绑定和类型转换

4
我有一个关于WPF绑定和在XAML中转换UI对象所看到的数据类型的问题。
我有一个用户控件,我想在不同的应用程序中重复使用。该用户控件显示缩略图图像和多个TextBlocks以显示个人的人口统计信息,例如姓名和地址。用户控件用于MVVM设计,因此它绑定到特定于用户控件的ViewModel。
遵循典型的MVVM设计原则,用户控件的ViewModel通常嵌入在其他ViewModel中,以组成更大的UI。
用户控件视图模型期望某种类型(类)作为其绑定对象。 然而,嵌入UC VM的ViewModel具有完全不同的对象模型,因此它们不能简单地将其数据传递给UC VM。需要将父VM的数据模型转换为UC VM的数据模型。
我的问题是:是否有一种官方认可的方法来执行此转换?
我查看了IValueConverter和IMultiValueConverter,但这些看起来不是正确的方式。
我想我需要的是一种在父VM和嵌入式UC VM之间的包装器,在此包装器中将父VM的数据转换为UC VM所需的格式。
或者,基本上归结为我必须编写自定义UC VM来处理父VM提供的任何类型?

当您使用“用户控件视图模型”这个术语时,您指的是什么?您所提到的是被该用户控件使用的视图模型吗? - Josh G
4个回答

2

我同意Ken的观点,我认为他有答案。如果您有n个数据配置想要传递到一个公共用户控件中,则希望该数据配置的所有者将其转换为通用形式以绑定到用户控件。

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

public class SampleViewModel {
   ...

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

   ...
}

然后您需要在视图中将该属性绑定到您的用户控件。
<common:CommonUserControl DataContext={Binding Path=ControlData} ... >

1
如果父VM是子VM的超集,通常父VM只会持有对子VM的引用。它将该引用公开为属性,然后您将绑定一个ContentControl(或其他内容)到该属性。
这样不就解决了你的问题吗?

谢谢,如果父VM以UC VM的本地格式提供数据,那么这将很好地工作。换句话说,是的,父VM是子VM的超集,但数据是完全不同的格式。我对这个东西很新,所以你必须原谅我的无知。 - MattJ

0

0

如果你真的想要和需要进行类型转换,那么值转换器正是你想要使用的。尽管如此,通常像 IValueConverter 这样的东西处理的类型转换相对简单和直接。

然而,如果你的顶层/父级/管理用户控件需要解析一些较大类型的位和片段到托管其实际内容的用户控件中,那么这就是该顶层控件的工作。不要在 XAML 中纠缠于做所有这些事情。直接解析所需内容并直接设置这些子控件属性是完全可以的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接