【问题标题】:WPF data binding and type conversionWPF 数据绑定和类型转换
【发布时间】:2009-04-06 19:17:18
【问题描述】:

我有一个关于 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 提供的任何类型?

【问题讨论】:

  • 当您使用术语用户控件视图模型时是什么意思?相关用户控件使用的视图模型?

标签: wpf data-binding mvvm


【解决方案1】:

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

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

public class SampleViewModel {
   ...

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

   ...
}

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

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

【讨论】:

    【解决方案2】:

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

    这不能解决您的问题吗?

    【讨论】:

    • 谢谢,如果父 VM 以 UC VM 的本机格式提供数据,那将可以正常工作。换句话说,是的,父虚拟机是子虚拟机的超集,但数据格式完全不同。我是新手,所以你必须原谅我的无知。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-03-07
        • 2010-09-17
        • 2012-07-28
        • 2010-12-30
        • 1970-01-01
        • 2021-06-10
        • 2010-12-01
        • 1970-01-01
        相关资源
        最近更新 更多