【问题标题】:How to pass EventArgument information from view to view model in WPF?如何在 WPF 中将 EventArgument 信息从视图传递到视图模型?
【发布时间】:2010-03-21 05:11:20
【问题描述】:

我的应用程序中有 ListView 控件,它绑定到 CustomObject ListCustomObject> 的集合。 CustomObject 有单独的视图。此 ListView 具有单独的视图模型。

集合 List _customobject 包含在 ListView ViewModel 类中。

我的查询:

当用户双击 ListView 的任意行时,我想调用一个显示自定义对象属性的视图。 ListView 双击命令绑定到视图模型中的 ListViewDoublClick 命令。 CustomObject 在 listview 双击命令的事件参数中。为了实现这一点,我必须将自定义对象(或自定义对象的唯一 id 属性,通过它我可以从集合中检索自定义对象)作为命令参数传递。

请给我建议解决方案!

【问题讨论】:

    标签: wpf mvvm wpf-controls mvvm-foundation


    【解决方案1】:

    最简单的方法是在列表中添加一个双击事件处理程序。请记住:MVVM 并不意味着视图中没有代码!这意味着视图只处理视图关注点。您可以提出一个非常好的论点,即 EventArgs 仅对视图有意义,如果您想将其传递给 ViewModel,您应该只传递相关信息。 如果您必须执行诸如从 EventArgs 中提取数据以将其传递给 ViewModel 之类的操作,那么这是可以接受且正确的……并且比将 EventArgs 传递给 ViewModel 更好,恕我直言。

    (我相信我会在这一点上产生一些分歧,但处理 UI 交互是一个视图问题,如果替代方案是编写行为或使用框架来让单个控件在单个页面上工作,记住:YAGNI 和模式不是宗教。)

    一些 MVVM 框架允许您这样做(尽管有很多关于这是否是个好主意的讨论)。特别是,MVVM Light Toolkit 不久前添加了此功能以支持拖放(如果我没记错博文的话)。

    如果您没有使用 MVVM 框架,我已经编写了一个行为,以允许我在多个地方执行相同的操作时执行此操作。在这种情况下,我通常会从 EventArgs 中提取我关心的信息(即,您可能并不真正想要完整的事件 args,但您可能关心单击了哪个项目以及其他一些数据)。

    【讨论】:

    • 感谢本的回复。您通过声明“MVVM 并不意味着视图中没有代码”准确地指出了我的担忧。实际上,我可以通过在视图本身中添加双击事件处理程序并从事件参数中提取我的自定义对象来做到这一点。我想知道是否可以将事件参数信息传递给视图模型。请让我知道最佳实践或通常在这种情况下完成,其中信息只能从事件参数访问。再次非常感谢您的回复
    • 我不确定是否有一个建议可以归类为“最佳实践”,但通常考虑您传递给 ViewModel 的数据是否真的是 ViewData(例如坐标、EventArgs , ETC。)。如果是这样,请在视图中转换为 ViewModel 数据并将其交给 ViewModel 上的命令,恕我直言。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-24
    • 2020-09-21
    • 2012-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多