• MvvmLight ToolKit .Net4.5版本 CanExecute不能刷新界面bug


      一 问题重现

        1.在使用最新版本v5.1的MvvmLight中(其实这个问题很早就有了),发现CanExecute不能很好地工作了。一个简单的工程,只有MainWindow和MainWindowViewModel,代码如下

    MainWindow.xaml

    <Window x:Class="MvvmLightError.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">
        <Grid>
            <Button Width="100" Height="30" Content="OK" Command="{Binding OkCommand}"></Button>
    
            <Button Width="100" Height="30" Margin="0,100,0,0" Content="ChangeEnable" Command="{Binding ChangeEnableCommand}"></Button>
        </Grid>
    </Window>

    MainWindow.xaml.cs

    public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
    
                this.DataContext = new MainWindowViewModel();
            }
        }

    MainWindowViewModel.cs

    public class MainWindowViewModel : ViewModelBase
        {
            private bool _isEnabled;
    
            public RelayCommand OkCommand
            {
                get;
                set;
            }
    
            public RelayCommand ChangeEnableCommand
            {
                get;
                set;
            }
    
            public MainWindowViewModel()
            {
                OkCommand = new RelayCommand(OkCommandHanlder, CanOkCommandExecute);
    
                ChangeEnableCommand = new RelayCommand(ChangeEnableCommandHandler);
            }
    
            private void OkCommandHanlder()
            {
    
            }
    
            private bool CanOkCommandExecute()
            {
                return _isEnabled;
            }
    
            private void ChangeEnableCommandHandler()
            {
                _isEnabled = !_isEnabled;
            }
        }

    然而执行代码,点击ChangeEnable按钮,Ok按钮的可用状态不会改变。

    好,我们不改动代码,将程序集目标框架由原来的.net4.5换成.net4.0,相应地删除对MvvmLightToolKit的引用,重新添加对应版本的MvvmLightToolKit

    PM> install-package mvvmlight

    执行代码,点击ChangeEnable按钮,Ok按钮的可用状态相应的改变。

      二 问题来龙去脉

    首先就是到MvvmLightToolKit官网找相关资料,然后再版本发布日志中看到如下重要记录

    解决方法也有了,but why?

    于是去到MvvmLight的官网

    找到如下两段关键的描述

    由此观之老外的谦逊,还有问题产生的原因,作者想要把MvvmLight框架移植为PCL,但是PCL限制很多,并没有CommandManager,于是就不能提供 “命令是否可用控制控件是否可用”功能,但随后给出了解决方案

    即在.Net4.5或以上版本使用对应的MvvmLight版本时,修改命名空间GalaSoft.MvvmLight.Command为GalaSoft.MvvmLight.CommandWpf。

    到此,来龙去脉和解决方法都清楚了。

    记录一下,希望帮助到同样踩坑的同学。

    http://mvvmlight.codeplex.com/workitem/7659

    Demo下载:MvvmLightError.rar

  • 相关阅读:
    动态页面技术----EL技术、JSTL技术,javaEE的开发模式
    动态页面技术----JSP技术
    会话技术Cookie&Session
    HttpServletRequest
    设计模式和抽象类、方法
    类的继承
    类与对象
    面向对象和面向过程的区别
    PHP-错误处理
    PHP-文件加载
  • 原文地址:https://www.cnblogs.com/HelloMyWorld/p/4580514.html
Copyright © 2020-2023  润新知