代码之家  ›  专栏  ›  技术社区  ›  Edward Tanguay

如何在MVVM模式中使用WPF转换器?

  •  17
  • Edward Tanguay  · 技术社区  · 16 年前

    假设我有一个观点 视图模型A 有一个可观察的集合 客户

    视图模型B 用不同的数据填充它。

    但是如果在我的 显示我的客户,例如,我有一个“ContractToCustomerConverter”,它接受合同并返回要显示的相应客户。

    存在于MVVM模式之外 因此不知道我的ViewModel还有另一个客户源。

    • 这样它就可以参与MVVM模式提供的去耦工作了吗?
    • 有没有办法让我 那么转换器使用ViewModel可用的当前依赖项?
    • 或者转换器只是

    (在看到WPF演示应用程序中转换器的使用后,我遇到了这些问题 MVVM Template Toolkit download ,请参阅“Messenger示例”。)

    5 回复  |  直到 16 年前
        1
  •  13
  •   Thomas Levesque    16 年前

    我通常在MVVM中根本不使用转换器,除了纯UI任务(比如BooleanToVisibilityConverter)。而不是在CustomerModel中声明CustomerProperty,而不是在CustomerProperty中声明

        2
  •  11
  •   Edward Tanguay    16 年前

    this conversation 有一条评论同意肯特的立场,根本不使用转换器,很有趣:

    ViewModel基本上是类固醇的值转换器。它需要“原始”数据 并将其转换为便于呈现的内容,反之亦然。如果 属性,并且您正在使用值转换器,停止!为什么不创建一个 完全是价值转换器?

    this conversation

    我唯一能看到有用的地方 MVVM中的值转换器 面板对IsChecked的可见性 一个复选框,那么我需要使用 BooleanToVisibilityConverter。

        3
  •  9
  •   Tim Cooper    14 年前

    转换器不应与MVVM一起使用。事实上,我尽量不使用它们。VM应该做视图完成任务所需的一切。如果视图需要 Customer 基于 Contract 客户 属性,当 合同

    这种MVVM模式的一个优点是,我还可以将视图绑定到ViewModel B,后者用不同的数据填充它。

    我不同意那个说法。根据我的经验,视图不能在不同的VM类型之间共享,这也不是MVVM的目标。

        4
  •  5
  •   jason    16 年前

    对于那些在视图中有效地说没有“非平凡转换器”的人,您如何处理以下问题?

    假设我有一个气候传感器模型,它代表给定位置的各种仪器(气压计、湿度计、温度计等)的时间序列读数。

    假设我的视图模型从我的模型中公开了一组可观察到的传感器集合。

    我有一个包含WPF工具箱的视图 DataGrid 绑定到视图模型的 ItemsSource 属性设置为可观察的传感器集合。如何表示每个传感器的给定视图?通过显示一个小图形(想想Edward Tufte sparkline 这里)是通过使用转换器将时间序列转换为图像源生成的( TimeSeriesToSparklineConverter

    以下是我对MVVM的看法:模型向视图模型公开数据。视图模型向视图公开行为、模型数据和状态。视图的工作是可视化地表示模型数据,并为与视图模型状态一致的行为提供接口。

    SensorCollectionGUIViewModel 还有一个 SensorCollectionCommandLineViewModel

    这就是我对MVVM不断发展的理解的地方。所以对于那些说不使用转换器的人,你在这里做什么?

        5
  •  1
  •   Flashtheplayer    5 年前

    我认为转换器在MVVM中属于视图,请考虑以下情况:

    希望这对某人有帮助。

        6
  •  0
  •   Kugel    14 年前

    我将在这次讨论中加上我的2分钱。

    说明: 有些情况下,您需要在UI中以更多的方式在模型中表示1个值。我通过1类型公开这个值。另一种是通过转换器来处理。如果要通过VM中的2个属性公开1个值,则需要手动处理更新通知。

    TotalCount , DoneCount . 现在我希望这两个值都显示在TextBlocks中,另外我还希望显示done percentage。

    DivisionConverter 采用2个前面提到的整数的多个转换器。

    如果我有特别的 PercentDone 在VM中,我需要随时更新这个属性 DoneCount公司