其他分享
首页 > 其他分享> > 的RelayCommand CanExecute行为不起作用

的RelayCommand CanExecute行为不起作用

作者:互联网

我在获取RelayCommand来正确启用/禁用附加控件时遇到麻烦.

我已经将EventToCommand元素附加到按钮上.该命令已数据绑定到ViewModel.最初,该按钮被禁用(预期行为),但是我似乎无法获取CanExecute逻辑来检查其值.当CurrentConfigFile设置并存在时,应启用该按钮.我已经执行了代码,并在调试中检查了文件的值以确保已设置该文件的值,但该控件仍处于禁用状态.我已经尝试过CommandManager.InvalidateRequerySuggested()和command.RaiseCanExecuteChanged(),但不会启用.

我想知道lambda对于CanExecute行为是否无法正常工作(即使示例使用了它们)还是CanExecute行为需要数据绑定到另一个元素.

这是我的代码:

// The FileInfo being checked for existence before the button should be enabled
public const string CurrentConfigFilePN = "CurrentConfigFile";
public FileInfo CurrentConfigFile
{
    get
    {
        return _currentConfigFile;
    }

    set
    {
        if (_currentConfigFile == value)
        {
            return;
        }

        var oldValue = _currentConfigFile;
        _currentConfigFile = value;

        // Update bindings, no broadcast
        RaisePropertyChanged(CurrentConfigFilePN);
    }
}

public MainViewModel()
{
    // snip //

    SaveCommand = new RelayCommand(SaveConfiguration, 
        () => CurrentConfigFile != null && CurrentConfigFile.Exists);
    }

private void SaveConfiguration()
{

    // export model information to xml document
    ExportXMLConfiguration(CurrentConfigFile);

}

和标记

<Button x:Name="SaveButton" Content="Save" Width="75" Margin="20,5">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="Click">
            <GalaSoft:EventToCommand x:Name="SaveETC" 
                Command="{Binding SaveCommand}" 
                MustToggleIsEnabledValue="true" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
</Button>

更新:

根据Isak Savo的建议,我将RelayCommand直接绑定到带有

<Button x:Name="SaveButton" Content="Save" Width="75" Margin="20,5" 
Command="{Binding SaveCommand}"/>

并在设置FileInfo时开始禁用并正确启用.猜猜我应该记得不要修复未损坏的东西!

解决方法:

为什么不直接从Button绑定到Command?

<Button Command="{Binding SaveCommand}" Content="Save" />

也许您正在使用的EventToCommand东西使命令的CanExecute通知变得混乱.

关于CanExecute问题-您确定在设置CurrentConfigFile属性后调用CanExecute处理程序吗?我发现即使WPF在重新查询CanExecute方面做得很好,但有时我仍然需要强制通过CommandManager进行重新查询.

编辑:如评论中指出,OP已经尝试了命令管理器方法.

标签:mvvm-light,wpf,c
来源: https://codeday.me/bug/20191209/2096561.html