如何通过viewmodel找到view?

之前的做法是,在view加载时(Loaded),将view保存到viewmodel中,后来想想Caliburn-Micro,自带方法可以通过viewmodel找到view,但是在网上搜索一番,无果。但是后来仔细想想,除非在viewmodel和view之间建立关系,否则是是找不到的。大部分viewmodel是作为对应的view的datacontext。要找到view,难道遍历可视化树,比对datacontex?显然是不行的,wpf不提供,Caliburn-Micro是否在绑定viewmodel是否做了手脚?看到以下的代码:

public static Action<object, DependencyObject, object> Bind = (viewModel, view, context) => {
if ((bool)view.GetValue(noContext)) {
Action.SetTargetWithoutContext(view, viewModel);
}
else {
Action.SetTarget(view, viewModel);
} var viewAware = viewModel as IViewAware;
if (viewAware != null) {
Log.Info("Attaching {0} to {1}.", view, viewAware);
viewAware.AttachView(view, context);
} if ((bool)view.GetValue(ConventionsAppliedProperty)) {
return;
} var element = View.GetFirstNonGeneratedView(view) as FrameworkElement;
if (element == null) {
return;
};

___var viewAware = viewModel as IViewAware;

if (viewAware != null) {

Log.Info("Attaching {0} to {1}.", view, viewAware);

viewAware.AttachView(view, context);

}


namespace Caliburn.Micro {
using System;
/// <summary>
/// Denotes a class which is aware of its view(s).
/// </summary>
public interface IViewAware {
/// <summary>
/// Attaches a view to this instance.
/// </summary>
/// <param name="view">The view.</param>
/// <param name="context">The context in which the view appears.</param>
void AttachView(object view, object context = null); /// <summary>
/// Gets a view previously attached to this instance.
/// </summary>
/// <param name="context">The context denoting which view to retrieve.</param>
/// <returns>The view.</returns>
object GetView(object context = null); /// <summary>
/// Raised when a view is attached.
/// </summary>
event EventHandler<ViewAttachedEventArgs> ViewAttached;
}
}

所以只要viewmodel实现IViewAware接口就可以。

通过viewmodel找到view的更多相关文章

  1. MVVM模式下,ViewModel和View,Model有什么区别

    摘自正美的5群 Model:很简单,就是业务逻辑相关的数据对象,通常从数据库映射而来,我们可以说是与数据库对应的model. View:也很简单,就是展现出来的用户界面. 基本上,绝大多数软件所做的工 ...

  2. js架构设计模式——MVVM模式下,ViewModel和View,Model有什么区别

    MVVM模式下,ViewModel和View,Model有什么区别 Model:很简单,就是业务逻辑相关的数据对象,通常从数据库映射而来,我们可以说是与数据库对应的model. View:也很简单,就 ...

  3. MVVM模式中ViewModel和View、Model有什么区别

    Model:很简单,就是业务逻辑相关的数据对象,通常从数据库映射而来,我们可以说是与数据库对应的model. View:也很简单,就是展现出来的用户界面. 基本上,绝大多数软件所做的工作无非就是从数据 ...

  4. ViewModel处理View相关事件的多种方式(非技术贴,仅学习总结)

    众所周知,在UWP中,微软为我们提供了一种新的绑定方式:x:bind,它是基于编译时的绑定.在性能方面,运行时绑定Binding与它相比还是有些逊色的.因此针对一些确定的.不需要变更的数据,我们完全有 ...

  5. wpf MVVM ViewModel 关闭View显示

    上次说到了不同wpf窗体之间的交互,这个在MVVM模式之中用起来会方便很多 下面我来说下在ViewModel中关闭View的方法,其实也很简单的,注释照样不写,一看就懂的 public partial ...

  6. WPF:MVVM模式下ViewModel关闭View

    不外乎两种基本方法. 消息通知和参数传递. 一.消息通知 利用View里的IsEnable属性 原理是这样的: 1.UI中的IsEnabled绑定VM中的属性 2.UI的后台代码中,注册IsEnabl ...

  7. MVVM实现ViewModel获取View输入验证状态

    由于Binding只把Convert成功的值送往Source,当目标中的值Convert失败时Source的值依然是旧值,所以ViewModel必须获取View的输入验证状态,以下是本人的实现. 当“ ...

  8. WPF:MVVM模式下ViewModel调用View

    两种基本方法: 消息通知和参数传递 一.消息通知 利用View里的IsEnable属性 原理是这样的: 1.UI中的IsEnabled绑定VM中的属性 2.UI的后台代码中,注册IsEnableCha ...

  9. wpf mvvm模式下 在ViewModel关闭view

    本文只是博主用来记录笔记,误喷 使用到到了MVVM中消息通知功能 第一步:在需要关闭窗体中注册消息 public UserView() { this.DataContext = new UserVie ...

随机推荐

  1. Sql With as 用法

    with district as (     select  * from Area where AbbrTW= N'中國'     union all     select  a.* from Ar ...

  2. BAT 快速删除CVS文件和拷贝最近修改文件的目录结构

    相信大家在操作大量文件的的时候,经常会遇到一些手动很难操作的情况 比如有CVS版本控制下每个文件夹下都有一个CVS文件夹,一个个手工删除肯定很费劲,我们都是懒人,还是用工具解决吧.不用重新写程序,直接 ...

  3. 基于WDF的PCI/PCIe接口卡Windows驱动程序(5)-如何为硬件移植驱动程序

    原文地址:http://www.cnblogs.com/jacklu/p/6139347.html 正如前几篇博客所说,使用WDF开发PCIe驱动程序是我本科毕业设计的主要工作.在读研的两年,我也分别 ...

  4. C# ASP.NET(配置数据库 sql server 地址的两种形式以及配置信息的获取)

    ( 1 ) 数据库装在本机,并且采用windows认证模式 <connectionStrings>    <add name="SQLConnectionString&qu ...

  5. 照片元数据信息以及在照片中写入gps信息

    /// 照片元数据编码 在下面的文章里,可以看到图片所有的元数据定义信息 https://msdn.microsoft.com/zh-cn/library/system.drawing.imaging ...

  6. vs2012中将图片放到resource中进行调用

    1.在项目中新建一个名叫resource的文件夹,然后将所需图片信息放入该文件夹,如图 2.右击该项目,选择属性->资源选项卡,步骤如图所示 点击添加现有文件,然后找到你刚刚添加的resourc ...

  7. pip 安装 MySQL-python 失败

    今天在安装 MySQL-python 提示 EnvironmentError: mysql_config not found 得知 mysql_config 是属于MySQL开发用的文件,而使用apt ...

  8. unity中三种调用其他脚本函数的方法

    第一种,被调用脚本函数为static类型,调用时直接用  脚本名.函数名()第二种,GameObject.Find("脚本所在的物体的名字").SendMessage(" ...

  9. java.util.regex.PatternSyntaxException: Dangling meta character '*' near index 0

    使用repalceAll 方法出现java.util.regex.PatternSyntaxException: Dangling meta character '*' near index 0异常 ...

  10. yum阿里云镜像源

    阿里云是最近新出的一个镜像源.得益与阿里云的高速发展,这么大的需求,肯定会推出自己的镜像源.阿里云Linux安装镜像源地址:http://mirrors.aliyun.com/ CentOS系统更换软 ...