4

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

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

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

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

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

我查看了 IValueConverter 和 IMultiValueConverter ,这些看起来不像是要走的路。

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

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

4

4 回答 4

2

我同意肯,我认为他有答案。如果您有 n 个要传递到通用用户控件的数据配置,那么您希望该数据配置的所有者将其转换为通用表单以绑定到用户控件。

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

public class SampleViewModel {
   ...

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

   ...
}

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

<common:CommonUserControl DataContext={Binding Path=ControlData} ... >
于 2009-04-20T03:09:19.717 回答
1

如果父虚拟机是子虚拟机的超集,通常父虚拟机只会持有对子虚拟机的引用。它会将该引用作为属性公开,并且您会将 a ContentControl(或其他)绑定到该属性。

这不能解决你的问题吗?

于 2009-04-06T20:17:08.487 回答
0

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

但是,如果您的顶级/父/管理用户控件需要将一些较大类型的点点滴滴解析给承载其实际内容的用户控件,那么这就是该顶级控件的工作。不要全神贯注于在 XAML 中执行所有这些操作。解析出您需要的内容并直接设置这些子控件属性是非常好的。

于 2009-04-19T17:55:03.153 回答
0

可能不是您正在寻找的,但这是 DataGrid 动态列的解决方案。使用数据网格,您可以传递参数。 http://www.codeproject.com/Articles/36496/Binding-a-Silverlight-DataGrid-to-dynamic-data-Part-2-editable-data-and-INotifyPropertyChanged.aspx

于 2011-02-07T23:27:53.530 回答