用MVVM设计模式时可以选择Prism,肯定要用到命令绑定。关于命令传参的文章多如牛毛,陈老师的文章写得很精彩,建议大家去看看。网址如下:http://www.cnblogs.com/chenxizhang/archive/2012/04/14/2446782.html。
我在看完这个视频之后,立马就动手实践了,发现,当参数为string类型的时候,没有任何问题,当参数为int的时候就有问题了,其中的匿名方法体根本没有被执行。几经周折,终于找到了问题根源。
新建一个wpf项目,加个VM:MainWindowViewModel.cs,用NuGet引入Prism包,就可以开始我们的demo了。
MainWindow.xaml代码如下:
<Window x:Class="WpfDemo.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:cmd="clr-namespace:Microsoft.Practices.Prism.Commands;assembly=Microsoft.Practices.Prism" xmlns:local="clr-namespace:WpfDemo" Title="MainWindow" Height="350" Width="525"> <Window.DataContext> <local:MainWindowViewModel ></local:MainWindowViewModel> </Window.DataContext> <Grid> <Button cmd:Click.Command="{Binding TemperatureUpCommand}" cmd:Click.CommandParameter="{Binding Temperature}" Content="Button" Height="23" HorizontalAlignment="Left" Margin="201,103,0,0" Name="button1" VerticalAlignment="Top" Width="75" /> </Grid> </Window>
MainWindowViewModel.cs代码如下:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using Microsoft.Practices.Prism.ViewModel; 6 using System.Windows.Input; 7 using Microsoft.Practices.Prism.Commands; 8 9 namespace WpfDemo 10 { 11 public class MainWindowViewModel:NotificationObject 12 { 13 private int _Temperature; 14 15 public int Temperature 16 { 17 get { return _Temperature; } 18 set 19 { 20 _Temperature = value; 21 RaisePropertyChanged("Temperature"); 22 } 23 } 24 25 public ICommand TemperatureUpCommand 26 { 27 get 28 { 29 return new DelegateCommand<int>( 30 (Temp) => 31 { 32 Temperature += 1; 33 } 34 ); 35 } 36 } 37 38 } 39 }
至此环境就准备好了,然后跑起来,在31行打个断点,点击按钮,发现程序没有任何反应,断点也进不去。按照道理来讲是应该能进去的,大家如果都是string类型的肯定可以进去,前台的CommandParameter绑定string类型的属性,VM的DelegateCommand后面也改成string,此时就能进去。那么,大家都是int,也应该可以进去,为什么实际上却进不去呢?
当你把后台的DelegateCommand的参数类型改成object时就能进去了,这也是一个解决办法,但是不是问题的根本,string的可以,为何int的就需要如此麻烦呢?
接下来,在VS2010里依次打开调试→异常,弹出如下窗口:
之前没有任何反应,也不报异常,是因为这里的勾勾没勾上,现在勾上再试试,果然,刚跑起来就报错了:
现在明白了,原来问题在这里,把29行 return new DelegateCommand<int>( 改成 return new DelegateCommand<int?>( 问题就解决了。
交流群:
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。