如果CanExecute必须是一个方法而不是一个属性怎么办?

时间:2017-03-20 09:51:50

标签: wpf mvvm caliburn.micro inotifypropertychanged

所以我有这个观点:

<StackPanel>
        <TextBox x:Name="Name"/>
        <Button x:Name="SayHello"
                Content="Click Me" />
    </StackPanel>

我有这个ViewModel:

internal class ShellViewModel : PropertyChangedBase
    {

        private string name;

        public string Name
        {
            get { return name; }
            set
            {
                name = value;
                NotifyOfPropertyChange(() => Name);
                NotifyOfPropertyChange(() => CanSayHello());
            }
        }

        public bool CanSayHello()
        {
            bool isenabled = !string.IsNullOrWhiteSpace(Name);
            return isenabled;
        }

        public void SayHello()
        {
            MessageBox.Show(string.Format("Hello, {0}!", Name));
        }
    }

但每当我在文本框中输入一些值时,我就会遇到这个例外:

{&#34;无法投射类型&#39; System.Linq.Expressions.InstanceMethodCallExpressionN&#39;输入&#39; System.Linq.Expressions.MemberExpression&#39;。&#34;}

在我开发的商业应用中,我必须将VM中的CanSayHello()成员作为方法,而不是属性。我该怎么办?

2 个答案:

答案 0 :(得分:2)

您有异常,因为您在CanSayHello上调用NotifyOfPropertyChange而CanSayHello是一个方法,而不是属性。

更改为:

public bool CanSayHello
{
     get { return !string.IsNullOrWhiteSpace(Name); }
}

答案 1 :(得分:-2)

您应该使用命令将操作绑定到UI项目。有一个名为ICommand的{​​{1}}实现,通常用于大多数WPF项目。它允许您使用方法,属性或谓词。

RelayCommand