zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    PAT 甲级 1015 Reversible Primes (20 分) (进制转换和素数判断(错因为忘了=))
    『Spring.NET+NHibernate+泛型』框架搭建之DAO(三)★
    (C#)使用队列(Queue)解决简单的并发问题
    VB.NET多线程入门
    Machine Learning With Spark学习笔记(在10万电影数据上训练、使用推荐模型)
    JAVA 并发编程-多个线程之间共享数据(六)
    POJ 3087 Shuffle&#39;m Up(模拟)
    cocos2dx --- 富文本的使用 RichText
    &lt;LeetCode OJ&gt; 217./219. Contains Duplicate (I / II)
    java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
  • 原文地址:https://www.cnblogs.com/HelloMyWorld/p/4580514.html
Copyright © 2011-2022 走看看