c# - Caliburn.Micro,MVVM 模式 : CanExecute command doesn't work

标签 c# wpf mvvm caliburn.micro

这是我的观点:

<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 模型中创建一个 NameCustomerName 属性来绑定(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/

相关文章:

c# - If-Else 条件下的运算符

c# - 在 WPF 中将窗口置于最前面

c# - 我可以扩展命令类,以便自动禁用绑定(bind)到它的按钮吗?

c# - WPF Listview中的多选和多种样式

silverlight - Silverlight 的各种 MVVM 框架的优点和缺点是什么?

c# - 如何去掉字符串中的\r\n

c# - 使用 COM 互操作从非托管代码调用托管委托(delegate)

c# - FOREACH返回的对象顺序是否稳定?

c# - 将一个 child 附加到网格,设置它的行和列

wpf - UI更新不快