zoukankan      html  css  js  c++  java
  • 基于Prism的CommandParameter参数类型为int时无响应

      用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?>( 问题就解决了。

      源代码下载:https://files.cnblogs.com/zoexia/WpfDemo.rar

  • 相关阅读:
    struct模块
    socketserver模块
    操作系统的基础知识和进程
    day28
    day27
    内心要强大
    《人生》
    下棋+《人生》
    悲哀+鸡眼
    脑壳疼
  • 原文地址:https://www.cnblogs.com/zoexia/p/3118026.html
Copyright © 2011-2022 走看看