这是我的观点:
<StackPanel Orientation="Horizontal" VerticalAlignment="Top">
<Label>Customer name:</Label>
<TextBox Text="{Binding Customer.Name, UpdateSourceTrigger=PropertyChanged}" Width="136"/>
<Button x:Name="UpdateClick">Update</Button>
</StackPanel>
这是我的 View 模型:
private Customer customer;
public Customer Customer
{
get { return customer; }
set { customer = value; NotifyOfPropertyChange(() => Customer); }
}
public bool CanUpdateClick
{
get
{
if (string.IsNullOrEmpty(customer.Name))
{
return false;
}
return true;
}
}
public void UpdateClick()
{
//...
}
这是我的模型:
private string name;
public string Name
{
get { return name; }
set { name = value; NotifyOfPropertyChange(() => Name); }
}
所以我有 UpdateClick 方法,它工作得很好。我也有 CanUpdateClick 属性,但它不起作用,我不知道为什么?当文本框为空时,UI 上的按钮应该被禁用。请帮忙!
最佳答案
您可以订阅 Customer
类的 PropertyChanged
事件(因为您似乎是 PropertyChangedBase
的子类)并调用 NotifyOfPropertyChanged (() => CanUpdateClick)
当 Name
属性改变时:
// in your view model
// i'm assuming here that Customer is set before your view model is activated
protected override void OnActivate()
{
base.OnActivate();
Customer.PropertyChanged += CustomerPropertyChangedHandler;
}
protected override void OnDeactivate(bool close)
{
base.OnDeactivate(close);
// unregister handler
Customer.PropertyChanged -= CustomerPropertyChangedHandler;
}
// event handler
protected void CustomerPropertyChangedHandler(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == nameof(Customer.Name))
{
NotifyOfPropertyChange(() => CanUpdateClick);
}
}
或者,您可以只在 View 模型中创建一个 Name
或 CustomerName
属性来绑定(bind),然后 a) 使用 Customer.Name
作为您的支持字段或 b) 使用普通支持字段,然后在更新时设置 Customer.Name
:
在你看来:
<TextBox Text="{Binding CustomerName, UpdateSourceTrigger=PropertyChanged}" Width="136"/>
下面是如何在 View 模型中实现选项 a:
public string CustomerName
{
get { return Customer.Name; }
set
{
Customer.Name = value;
NotifyOfPropertyChange(); // CallerMemberName goodness
NotifyOfPropertyChange(() => CanUpdateClick);
}
}
关于c# - Caliburn.Micro,MVVM 模式 : CanExecute command doesn't work,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41081186/