wpf 命令RaiseCanExecuteChanged未在文本更改事件中激发

gijlo24d  于 2023-08-07  发布在  其他
关注(0)|答案(1)|浏览(112)

我将按照article使用MVVMC创建一个wpf向导应用程序。
我想做的是禁用按钮时,文本框的内容是空的。添加文本更改事件以检查用户的输入。如果为空,则调用RaiseCanExecuteChanged以触发按钮的canExecute()。但是canExecute不会被触发。
我在wpf用户控件中测试了这些代码,它可以被触发。但是当我把它们移到MVVMC时,它不起作用。
下面是代码片段。我上传完整的项目到repo
示例1:

<TextBox Text="{Binding ComputerName}" TextChanged="ComputerName_TextChanged"/>
<Button Command="{Binding TestCommand}">Test</Button>

字符串
xaml.cs:

private void ComputerName_TextChanged(object sender, TextChangedEventArgs e)
{
   viewModel.HandleComputerNameTextChanged(((TextBox)sender).Text);
}


视图模型:

private string computerName = "";
    public string ComputerName
    {
        get
        {
            return computerName;
        }
        set
        {
            computerName = value;
            OnPropertyChanged();
        }
    }

    internal void HandleComputerNameTextChanged(string text)
    {
        ComputerName = text;
        TestCommand.RaiseCanExecuteChanged();
    }

    public ICommand _testCommand;
    public virtual ICommand TestCommand
    {
        get
        {
            if (_testCommand == null)
            {
                _testCommand = new DelegateCommand(
                    () =>
                    {
                        MessageBox.Show("test");
                    },
                    () => canGotoNext());
            }
            return _testCommand;
        }
    }

    public virtual bool canGotoNext()
    {
        if (string.IsNullOrEmpty(ComputerName))
        {
            return false;
        }
        else
        {
            return true;
        }
    }

i34xakig

i34xakig1#

设置UpdateSourceTrigger=PropertyChanged而不是使用TextChanged事件来触发命令CanExecute()
XAML:

<TextBox Text="{Binding Path=ComputerName, UpdateSourceTrigger=PropertyChanged}" />
<Button Command="{Binding TestCommand}">Test</Button>

字符串
视图模型:

private string computerName = "";
    public string ComputerName
    {
        get
        {
            return computerName;
        }
        set
        {
            computerName = value;
            OnPropertyChanged();
            TestCommand.RaiseCanExecuteChanged();
        }
    }

相关问题