使用MVVM时如何从ViewModel中访问View成员?

时间:2016-03-20 13:39:58

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

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

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

我遇到的一个主要问题是找到一种MVVM方法来处理我的ViewModel中的RichEditBox。这个特定的控件不能通过XAML完全操作,需要使用代码。

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

2 个答案:

答案 0 :(得分:5)

MVVM的重点是分离视图和视图模型。

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

答案 1 :(得分:0)

有时您可能并不严格,仅使用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;