首页 > 解决方案 > 切换到 MVVMLight 时出现 CanExecute 问题

问题描述

我一直在使用RelayCommand从一篇文章(可能是这篇文章)中复制的内容,并且CreateExamCommand下面的工作正常,与CanExecute“名称”是否为空有关。

XAML

<UniformGrid Columns="2" DockPanel.Dock="Bottom">
    <Button Content="Cancel" Command="{Binding CancelCommand}" HorizontalAlignment="Left"/>
    <Button Content="Create" Command="{Binding CreateExamCommand}" HorizontalAlignment="Right"/>
</UniformGrid>

<StackPanel VerticalAlignment="Center">
    <TextBox Name="textBox" Tag="Exam Name" 
             Text="{Binding Name, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" />

夏普

public RelayCommand CreateExamCommand => new RelayCommand(
  () => CreateExam(Name, Date),
  () => !string.IsNullOrEmpty(_name)
);

但是,我刚刚安装了 MVVMLightLibs,以替换我手动复制的代码(并删除了我的RelayCommand. 现在的CanExecute方法CreateExamCommand被打破了。

WriteLine在里面放了一些 s CanExecute,它似乎只在第一次加载视图(模型)时运行。

我该如何解决?

标签: c#wpfmvvm-light

解决方案


这取决于您使用的 MVVMLight 的 RelayCommand 版本。

如果您有命名空间“GalaSoft.MvvmLight.CommandWpf”,那么您的命令将使用 CommandManager 对象并在每次击键或鼠标单击后自动刷新 CanExecute。

如果您有“GalaSoft.MvvmLight.Command”,那么您必须手动触发 CanExecute - 添加CreateExamCommand.RaiseCanExecuteChanged()您的 Name 属性的设置器。


推荐阅读