当前位置: 首页 > news >正文

wpf 点击按钮弹出新对话框_wpf-打开文件对话框MVVM

ViewModel不应打开对话框,甚至不知道它们的存在。 如果VM位于单独的DLL中,则该项目不应引用PresentationFramework。

我喜欢在视图中为常见对话框使用帮助器类。

helper类公开了XAML中窗口绑定到的命令(不是事件)。 这意味着在视图中使用RelayCommand。 助手类是DepencyObject,因此它可以绑定到视图模型。

class DialogHelper : DependencyObject

{

public ViewModel ViewModel

{

get { return (ViewModel)GetValue(ViewModelProperty); }

set { SetValue(ViewModelProperty, value); }

}

public static readonly DependencyProperty ViewModelProperty =

DependencyProperty.Register("ViewModel", typeof(ViewModel), typeof(DialogHelper),

new UIPropertyMetadata(new PropertyChangedCallback(ViewModelProperty_Changed)));

private static void ViewModelProperty_Changed(DependencyObject d, DependencyPropertyChangedEventArgs e)

{

if (ViewModelProperty != null)

{

Binding myBinding = new Binding("FileName");

myBinding.Source = e.NewValue;

myBinding.Mode = BindingMode.OneWayToSource;

BindingOperations.SetBinding(d, FileNameProperty, myBinding);

}

}

private string FileName

{

get { return (string)GetValue(FileNameProperty); }

set { SetValue(FileNameProperty, value); }

}

private static readonly DependencyProperty FileNameProperty =

DependencyProperty.Register("FileName", typeof(string), typeof(DialogHelper),

new UIPropertyMetadata(new PropertyChangedCallback(FileNameProperty_Changed)));

private static void FileNameProperty_Changed(DependencyObject d, DependencyPropertyChangedEventArgs e)

{

Debug.WriteLine("DialogHelper.FileName = {0}", e.NewValue);

}

public ICommand OpenFile { get; private set; }

public DialogHelper()

{

OpenFile = new RelayCommand(OpenFileAction);

}

private void OpenFileAction(object obj)

{

OpenFileDialog dlg = new OpenFileDialog();

if (dlg.ShowDialog() == true)

{

FileName = dlg.FileName;

}

}

}

helper类需要对ViewModel实例的引用。 请参阅资源字典。 在构造之后,就设置了ViewModel属性(在XAML的同一行中)。 这是当帮助程序类的FileName属性绑定到视图模型上的FileName属性时。

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

xmlns:local="clr-namespace:DialogExperiment"

xmlns:vm="clr-namespace:DialogExperimentVM;assembly=DialogExperimentVM"

Title="MainWindow" Height="350" Width="525">

相关文章:

  • DCL记忆上次输入值lisp_如何快速记忆Word中Ctr+字母、数字快捷键
  • go定时器 每天重复_腾讯 Go 性能优化实战
  • 注入js文件_你需要知道的依赖注入
  • 世界机器人冠军王宇航_带队两夺机器人世界杯冠军 金牌教练是如何养成的
  • tanh函数matlab_MATLAB常用数学函数
  • arma模型平稳性和可逆性的条件_时间序列 | 第四章 模型识别
  • matlab中cvx例子_机器学习中的相似性度量总结
  • 8266连接mqtt发送消息_未读消息(小红点),前端 与 RabbitMQ 实时消息推送实践,贼简单~...
  • 容器删除元素后迭代器失效_Java容器类源码分析之Iterator与ListIterator迭代器(基于JDK8)...
  • 3训练模型代码详解_一行代码不用写,就可以训练模型?
  • 计算各种形钢的重量用什么软件_钢结构防火防腐工程预算工程量计算方法
  • 神经网络训练的时间越来越长_基于对抗训练深度神经网络的时间序列分类
  • idea svn查看提交人_idea+svn看不到以前的版本记录,只能看往后的提交记录。先前的都用svnadmin表示了,为什么?...
  • 源码剖析_Scrapy 源码剖析(一)架构概览
  • linux4.1.15 rt补丁_听说你不知道 RT-Thread 有个 ringbuffer
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • CentOS 7 修改主机名
  • Java比较器对数组,集合排序
  • Java读取Properties文件的六种方法
  • Js基础知识(一) - 变量
  • node-glob通配符
  • overflow: hidden IE7无效
  • php中curl和soap方式请求服务超时问题
  • Protobuf3语言指南
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • Spring Cloud中负载均衡器概览
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • 分类模型——Logistics Regression
  • 分享一份非常强势的Android面试题
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 实习面试笔记
  • 在Unity中实现一个简单的消息管理器
  • linux 淘宝开源监控工具tsar
  • 扩展资源服务器解决oauth2 性能瓶颈
  • 通过调用文摘列表API获取文摘
  • 组复制官方翻译九、Group Replication Technical Details
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • $.ajax中的eval及dataType
  • %check_box% in rails :coditions={:has_many , :through}
  • (33)STM32——485实验笔记
  • (C语言)球球大作战
  • (pojstep1.1.2)2654(直叙式模拟)
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (力扣)1314.矩阵区域和
  • (算法)Game
  • (一)基于IDEA的JAVA基础1
  • (原)Matlab的svmtrain和svmclassify
  • (转)EOS中账户、钱包和密钥的关系
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .NET/C# 使用反射注册事件
  • .NetCore 如何动态路由
  • @ConfigurationProperties注解对数据的自动封装
  • [ 隧道技术 ] 反弹shell的集中常见方式(四)python反弹shell
  • [<死锁专题>]