【发布时间】:2017-03-20 09:51:50
【问题描述】:
所以我有这个观点:
<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));
}
}
但是每当我在文本框中输入一些值时,我都会得到这个异常:
{“无法将'System.Linq.Expressions.InstanceMethodCallExpressionN'类型的对象转换为'System.Linq.Expressions.MemberExpression'类型。”}
在我正在开发的商业应用程序中,我必须将 VM 中的 CanSayHello() 成员作为方法,而不是作为属性。我该怎么办?
【问题讨论】:
-
我在这里使用 Caliburn.Micro。
-
NotifyOfPropertyChange作为名称直接表示它通知属性更改。如果您仅限于使用CanSayHello()作为操作守卫,那么您无能为力。 -
private getter bool,否则你将不得不滚动你自己的命令......或者使用绑定。考虑到它被封装在单个对象中并且没有向量可以利用......这种设计要求很愚蠢。
标签: wpf mvvm caliburn.micro inotifypropertychanged