转自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# WPF MVVM 实战 – 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. 九度oj 题目1482:玛雅人的密码 清华大学机试

    题目描述: 玛雅人有一种密码,如果字符串中出现连续的2012四个数字就能解开密码.给一个长度为N的字符串,(2=<N<=13)该字符串中只含有0,1,2三种数字,问这个字符串要移位几次才能 ...

  2. Python Excel导入数据库

    import xlrd import MySQLdb def inMySQL(file_name): wb = xlrd.open_workbook(file_name) sh = wb.sheet_ ...

  3. 【Luogu】P3787冰精冻西瓜(线段树)

    题目链接 我脑子怕不是有坑qwqqq 用前缀和思想,dis[i]表示i离根的距离,那么修改操作其实是对x的子树区间加y/dis[x],查询的时候*dis[to]即可. 对付/0错的思路是建森林,然而这 ...

  4. 修改Tomcat HTTP端口号(8080→8088)Eclipse

    1.如果不用Eclipse,修改Tomcat的端口号,可以参考这篇: https://jingyan.baidu.com/article/adc815139b12def722bf7377.html t ...

  5. P1108 低价购买 (动态规划)

    题目链接 Solution 似乎就是个很简单的最长不上升子序列输出方案. 但是有一个很艹蛋的条件: 不同方案选择价格必须不同. 且其股票价格不保证不相同. \(f[i]\) 代表以第 \(i\) 天结 ...

  6. poj 1981 Circle and Points

    Circle and Points Time Limit: 5000MS   Memory Limit: 30000K Total Submissions: 8131   Accepted: 2899 ...

  7. 【BZOJ2693】jzptab (莫比乌斯反演)

    Description 给你$n$,$m$,求 $\sum^n_{i=1} \sum^m_{j=1} \ lcm(x,y)$ 答案对$100000009$取模. 多组数据. Input 第一行有一个正 ...

  8. utilize HttpClient to generate a SSL access and generate REST access to fetch data, async programming? cool and brief

    WebRequestHandler handler = new WebRequestHandler(); try { X509Certificate2 certificate = new X509Ce ...

  9. 41深入理解C指针之---指针与栈

    一.借助第40指针与链表的相关内容,稍微修改即可: 1.定义头文件stack.h代码如下: #include <stdlib.h> #include <stdio.h> #if ...

  10. 22深入理解C指针之---通过指针传递函数

    一.通过指针传递函数与通过指针传递数据的本质是一样的,区别就是此时的数据是函数指针(函数的开始的地址) 1.定义:通过函数指针将函数传入函数:通过函数返回函数指针实现函数返回函数的目标 2.特征: 1 ...