【问题标题】:How to access View members from within ViewModel when using MVVM?使用 MVVM 时如何从 ViewModel 中访问 View 成员?
【发布时间】:2016-03-20 13:39:57
【问题描述】:

我在网上搜索过,并没有找到任何对这个简单问题的直接解释......

我有一个正在开发的 UWP 应用程序,我只需要知道如何访问位于视图的 XAML 中的 Grid 元素或 Textblock 元素。我遇到的每一篇文章都是关于数据绑定的。我不想绑定数据。我只是想了解位于我的视图中的那些元素,以便我可以操纵它们。

例如,我遇到的一个主要问题是找到一种 MVVM 方法来从我的 ViewModel 中操作 RichEditBox。此特定控件无法完全通过 XAML 进行操作,需要使用代码。

是的,基本上,我如何从 ViewModel 中获取对这些对象的引用?

【问题讨论】:

  • 你需要先了解更多关于 MVVM 的知识。 MVVM 背后的想法是将视图(ui)与视图模型(表示逻辑)分开。话虽这么说,ViewModel 不知道视图内部发生的任何事情,所以答案是:根本不知道。你有命令和可通知的属性,这就是你用来与视图通信的东西。您可以使用其他工具来解决它,例如附加属性。附加属性可以附加到 XAML 中的用户控件,您可以将属性或命令绑定到它。
  • 如果你有一个足够复杂和通用的解决方案,你可以做一个用户控制。在用户控件中,您可以使用后面的代码来放置所有需要的逻辑,然后公开依赖属性以将命令和属性绑定到它。请参阅我对 stackoverflow.com/a/35983746/455493stackoverflow.com/a/35395128/455493 背后的用户控件和代码的类似问题的回答

标签: c# wpf xaml mvvm win-universal-app


【解决方案1】:

MVVM 的全部意义在于分离视图和视图模型。

如果您无法从视图模型中进行数据绑定,您可以随时将代码放入表单的代码中。

【讨论】:

    【解决方案2】:

    有时您不能严格地只使用 MVVM 模式,在某些情况下您需要操作 View 元素,例如在使用第三方组件时。 对于这种情况,例如将 LightMVVM 用于 UWP。在实例化 ViewModel 时,您可以传递对 View 的引用,最好的方法是使用某种依赖注入,不过,这里有一些实现建议:

        public abstract class BaseViewModel<TPage> 
        where TPage : class
    {
        public TPage View { get; private set; }
        ///this is a method but it could be a constructor as well..
        public TViewModel SetupParentPage<TViewModel>(TPage p)
            where TViewModel : class
        {
            if (View == null)
            {
                View = p;                                       
            }
            return (this as TViewModel);
        }
    }
    

    现在你要做的就是从 BaseViewModel 继承你的 ViewModel

    然后您可以使用以下方法访问页面的控件:

    View.FindName("YourControlName") as YourControlType;
    

    【讨论】:

      猜你喜欢
      • 2015-07-21
      • 1970-01-01
      • 1970-01-01
      • 2018-03-11
      • 1970-01-01
      • 2018-03-08
      • 1970-01-01
      • 2013-05-31
      • 1970-01-01
      相关资源
      最近更新 更多