【问题标题】:Enable Button and DelegateCommand启用按钮和委托命令
【发布时间】:2009-10-19 09:11:40
【问题描述】:

TextBox 中输入所需数据之前,如何禁用Button

我将Button 绑定到ICommand

public ICommand LoginCommand
{
    get
    {
        if (_loginCommand == null)
        {
            _loginCommand = new DelegateCommand<string>(this.Login, this.IsValid);
        }
        return _loginCommand;
    }
}

在 XAML 中像这样:

<Button Style="{StaticResource LoginButton}" Content="Login" Command="{Binding LoginCommand}" CommandParameter="{Binding Text, ElementName=txtUserName}" />

【问题讨论】:

    标签: wpf command prism


    【解决方案1】:

    您只需要引发重新查询事件。这很容易使用 DelegateCommand。这是您的 ViewModel 的外观。

    此外,如果没有令人信服的理由将您的属性设为 DelegateCommand 类型,那么您应该这样做。

    public class MyViewModel : ViewModel
    {
    
        private string _myTextField;
        public string MyTextField
        {
            get { return _myTextField; }
            set
            {
    
                _myTextField = value;
                OnPropertyChanged("MyTextField");
    
                //Here's the magic
                LoginCommand.RaiseCanExecuteChanged();
    
            }
        }
    
        public DelegateCommand<string> LoginCommand { get; set; }
    
        public MyViewModel()
        {
             LoginCommand = new DelegateCommand<string>(Login, CanLogin);
        }
    
        public bool CanLogin(string text)
        {
             return !string.IsNullOrEmpty(text);
        }
    
        public void Login(string text)
        {
             //login logic
        }
    
    }
    

    差不多了。

    【讨论】:

    • 抱歉,我不明白这句话:“另外,如果没有令人信服的理由将您的属性设为 DelegateCommand 类型,那么您应该这样做。”预期将是“......那么你不应该这样做”或“你应该始终使用 DelegateCommand,即使没有令人信服的理由这样做。”
    【解决方案2】:

    DelegateCommand 在哪里定义?检查构造函数,它可能期望第二个参数是谓词,其结果被映射到您的ICommandCanExecute

    我假设this.IsValid 是一个委托方法,如果您从视图传递的 Command 参数的 string.Length > 0 则返回 true...尝试将其设置为始终返回 false 以检查 UI 是否正在禁用按钮。

    编辑: 要将参数放入 IsValid 方法,请使用以下语法:

    更改 IsValid 方法的语法以接受字符串参数,然后像这样 decalre 你的 DelegateCommand:

    _loginCommand = new DelegateCommand<string>(this.Login, (param) => this.IsValid(param));
    

    HTH :)

    【讨论】:

    • 如果 this.IsValid() 方法返回 false UI 正在禁用按钮。这意味着 Button 在 UI 加载后立即被禁用,因为文本框中没有内容。我的问题是如果可以验证为真的文本输入到 TextBox,如何启用按钮?
    • DelegateCommand 来自 Composite WPF aka Prism 库:Microsoft.Practices.Composite.Presentation.Commands
    • 您需要将 CommandParameter 传递给方法...将更新答案以向您展示如何操作。
    • 使用我当前的代码 IsValid 方法正在获取命令参数。我面临的问题是,虽然文本发生了变化,但没有再次检查 CanExecute 的命令。
    • 我认为问题与 John Smith 在此处的条目有关:joshsmithonwpf.wordpress.com/2008/06/17/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-21
    相关资源
    最近更新 更多