笔记03 wpf 在MVVM模式下怎样在Viewmodel里面获得view的控件对象

时间:2022-06-15 22:47:44
 转自http://blog.csdn.net/qing2005/article/details/6601199
http://blog.csdn.net/qing2005/article/details/6601475

MVVM中轻松实现Command绑定(二)传递Command参数

属性栏里去设置的。语句应该是CommandParameter="{Binding ElementName=控件名}"

我们如果需要在Command中传递参数,实现也很简单。DelegateCommand还有一个DelegateCommand<T>版本,可以传递一个T类型的参数。

1.View的Button绑定,其中CommandParameter定义了一个“20”的参数

  1. <Window x:Class="WpfApplication1.Window1"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. xmlns:vm="clr-namespace:WpfApplication1"
  5. Title="Window1" Height="193" Width="190">
  6. <Window.DataContext>
  7. <vm:Window1ViewModel />
  8. </Window.DataContext>
  9. <Grid>
  10. <Button Content="Button" Height="33" HorizontalAlignment="Left" Margin="34,20,0,0" Name="button1" VerticalAlignment="Top" Width="109"
  11. Command="{Binding ButtonCommand}"
  12. CommandParameter="20"/>
  13. </Grid>
  14. </Window>

2.ViewModel定义命令,注意委托参数

  1. namespace WpfApplication1 {
  2. public class Window1ViewModel {
  3. public ICommand ButtonCommand {
  4. get {
  5. return new DelegateCommand<string>((str) => {
  6. MessageBox.Show("Button's parameter:"+str);
  7. });
  8. }
  9. }
  10. }
  11. }

并且,特殊情况下,我们可以将控件对象作为参数传递给ViewModel,注意{Binding RelativeSource={x:Static RelativeSource.Self}}是绑定自己(Button)的意思。

  1. <Window x:Class="WpfApplication1.Window1"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. xmlns:vm="clr-namespace:WpfApplication1"
  5. Title="Window1" Height="193" Width="190">
  6. <Window.DataContext>
  7. <vm:Window1ViewModel />
  8. </Window.DataContext>
  9. <Grid>
  10. <Button Content="Button" Height="33" HorizontalAlignment="Left" Margin="34,20,0,0" Name="button1" VerticalAlignment="Top" Width="109"
  11. Command="{Binding ButtonCommand}"
  12. CommandParameter="20"/>
  13. <Button Content="Button" Height="33" HorizontalAlignment="Left" Margin="34,85,0,0" Name="button2" VerticalAlignment="Top" Width="109"
  14. Command="{Binding ButtonCommand2}"
  15. CommandParameter="{Binding RelativeSource={x:Static RelativeSource.Self}}"/>
  16. </Grid>
  17. </Window>

再看ViewModel

  1. namespace WpfApplication1 {
  2. public class Window1ViewModel {
  3. public ICommand ButtonCommand {
  4. get {
  5. return new DelegateCommand<string>((str) => {
  6. MessageBox.Show("Button's parameter:"+str);
  7. });
  8. }
  9. }
  10. public ICommand ButtonCommand2 {
  11. get {
  12. return new DelegateCommand<Button>((button) => {
  13. button.Content = "Clicked";
  14. MessageBox.Show("Button");
  15. });
  16. }
  17. }
  18. }
  19. }

这样就可以在委托中获取Button对象了。但是MVVM本身比建议ViewModel操作View。

笔记03 wpf 在MVVM模式下怎样在Viewmodel里面获得view的控件对象的更多相关文章

  1. C&num; WPF MVVM 实战 &ndash&semi; 5- 用绑定,通过 VM 设置 View 的控件焦点

    本文介绍在 MVVM 中,如何用 ViewModel 控制焦点. 这焦点设置个东西嘛,有些争论.就是到底要不要用 ViewModel 来控制视图的键盘输入焦点.这里不讨论,假设你就是要通过 VM,设置 ...

  2. WPF中MVVM模式下控件自有的事件绑定

    1.原因 在WPF中单纯的命令绑定往往不能满足覆盖所有的事件,例如ComboBox的SelectionChanged事件,DataGrid的SelectionChanged事件等等,这时就可以用事件绑 ...

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

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

  4. WPF 在MVVM模式下弹出子窗体的方式

    主要是通过一个WindowManager管理类,在window后台代码中通过WindowManager注册需要弹出的窗体类型,在ViewModel通过WindowManager的Show方法,显示出来 ...

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

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

  6. WPF中在MVVM模式下,后台绑定ListCollectionView事件触发问题

    问题:WPF中MVVM模式下 ListView绑定ListCollectionView时,CurrentChanged无法触发 解决方案: 初期方案:利用ListView的SelectionChang ...

  7. WPF之MVVM模式(3)

    有种想写一个MVVM框架的冲动!!! 1.Model中的属性应不应该支持OnPropertyChanged事件? 不应该.应该有ViewModel对该属性进行封装,由ViewModel提供OnProp ...

  8. WPF实战案例-MVVM模式下在Xaml中弹出窗体

    相信很多学习和开发wpf项目的同学都了解过mvvm模式,同样,在mvvm模式下会有一个不可忽视的问题,就是怎么在xaml中弹出窗体,而不破坏MVVM本身的结构. 关于弹出窗体的方式还是很多的,本文先讲 ...

  9. MVVM模式下WPF动态绑定展示图片

    MVVM模式下WPF动态展示图片,界面选择图标,复制到项目中固定目录下面,保存到数据库的是相对路径,再次读取的时候是根据数据库的相对路径去获取项目中绝对路径的图片展示. 首先在ViewModel中 / ...

随机推荐

  1. 使用jquery实现单选框、多选框取消选中状态

    function radioReset(){ /*方式一*/ /* var radios = $("input[type='radio']"); for (i=0; i<ra ...

  2. 把硬盘格式化成ext格式的cpu占用率就下来了

    把硬盘格式化成ext格式的cpu占用率就下来了我是使用ext4格式 @Paulz 还有这种事情? 现在是什么格式?- - ,你自己用top命令看一下啊就知道什么东西在占用cpu了下载软件一半cpu都用 ...

  3. ExecutorService实际上是一个线程池的管理工具

    在Java5之后,并发线程这块发生了根本的变化,最重要的莫过于新的启动.调度.管理线程的一大堆API了.在Java5以后,通过Executor来启动线程比用 Thread的start()更好.在新特征 ...

  4. eclipse下Spring环境构建及插件

    首先获取spring tool suite插件 获取地址http://spring.io/tools/sts/ 然后打开eclipse选择菜单栏Help下Install new software添加我 ...

  5. 2018软件工程W班助教小结博客

    一.总体回顾 我是汪老师实验室的研二的一名研究生,在研一的课程中就上过老师带的高级软件工程(采取的模式是一样的,亲身经历了一学期所以对整体流程比较清楚).实验室的学生当老师实践课的助教是这几年流传下来 ...

  6. 【代码笔记】iOS-json文件的使用

    一,工程图. 二,代码. - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the ...

  7. POJ3150 Candies【差分约束】

    During the kindergarten days, flymouse was the monitor of his class. Occasionally the head-teacher b ...

  8. CSU 1808 - 地铁 - &lbrack;最短路变形&rsqb;

    题目链接:http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1808 Time limit: 5000 ms Memory limit: 13107 ...

  9. 【Hostname】Linux修改主机名称

    环境:CentOS 6.5 方式一: 1.修改hosts文件 vi /etc/hosts 将本机ip地址后面的hostname改掉 2.修改network文件 vi /etc/sysconfig/ne ...

  10. 17&period;scrapy框架简例使用

    目标:创建scrapy项目 创建一个spider来抓取站点和处理数据 通过命令行将抓取内容导出 1.创建项目 scrapy startproject tutorial 2.创建spider cd tu ...