【问题标题】:CanExecute Caliburn method not working with nested propertiesCanExecute Caliburn 方法不适用于嵌套属性
【发布时间】:2015-11-18 16:06:54
【问题描述】:

我正在尝试使用 Caliburn Micro CanExecute 方法将我的保存按钮绑定为禁用或不基于是否在文本框中输入值。

这是我的观点:

<TextBox Text="{Binding Current.Name}"/>
<Button Content="Save" Name="Save" />

我的 POCO:

[ImplementPropertyChanged] (fody)
public partial class POCO: IEntity
{
    public int Id { get; set; }
    public string Name { get; set; }
}

还有我的 ViewModel:

public void SetupViewModel()
{
    Current = new POCO();
}

public POCO Current { get; set; }

public bool CanSave => Current == null || !string.IsNullOrWhiteSpace(Current?.Name);

如果我设置一个变量并将其绑定到视图中(我们称之为POCOName)并将其传递给CanSave 它工作正常,似乎只是嵌套属性的问题。有人有什么想法吗?

【问题讨论】:

  • 我发现this SO question 似乎很相似,但从未找到解决方案,只是建议以不同的方式进行。无论如何它可以像这样工作吗?

标签: c# .net caliburn.micro


【解决方案1】:

操作约定功能使用 x:Name 指令而不是 Name 属性。

<TextBox Text="{Binding Current.Name}"/>
<Button Content="Save" x:Name="Save" />

更新
我已经尝试过使用 Name 属性,它也可以工作,抱歉给你错误的信息。

CanExcute 方法在您的情况下实际上是一个属性,例如,您需要通知属性更改。

public string Name
{ 
    get { return _name; }
    set
    {
        _name = value;
        NotifyOfPropertyChange(nameof(Name));
        // when Name changed, check if it is null or whitespace
        NotifyOfPropertyChange(nameof(CanSave));
    }
}

这取决于您的应用程序通知 CanExcute 属性更改的位置。
你也可以使用 CanExcute 方法,每次参数值改变时都会调用它。
有关 Caliburn Micro Action 的更多信息,请参阅All About Actions

【讨论】:

  • @wut 我已经更新了我的答案,抱歉给你提供了错误的信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-01
  • 2013-09-30
  • 1970-01-01
  • 2014-04-02
  • 1970-01-01
  • 2013-01-29
相关资源
最近更新 更多