当其CanX属性返回true时,Stylet Button未启用



使用样式表

我使用的是带有dotnet核心3.1的默认Stylet模板。我只是添加了一个属性/方法来重现这个问题。

<TextBox Text="{Binding Username, 
Mode=TwoWay, 
UpdateSourceTrigger=PropertyChanged}" 
Width="100" Height="100"/>
<Button Command="{s:Action Do}">Foo</Button>
public class ShellViewModel : Screen
{
public string Username { get; set; }
public void Do() { }
public bool CanDo => !string.IsNullOrWhiteSpace(Username);
}

CanDo属性上的断点只命中一次,以后再也不会命中。在调用set时更改TextBox中的值不会重新触发CanDo属性。

我还尝试过在SetAndNotify中使用后备字段,但没有成功:

public string Username { get => username; set => SetAndNotify(ref username, value, nameof(Username)); }

我意识到我缺少属性更改通知。通过我看到的所有例子,我认为这是Stylet为我隐式处理的

在将我的属性设置器更改为以下内容后,它可以按预期工作。

public string Username
{
get => _username;
set
{
SetAndNotify(ref _username, value);
NotifyOfPropertyChange(() => CanLogin);
}
}

PropertyChangedBase也注意与Fody.PropertyChanged集成。由Fody.ProductyChanged引发的通知是使用PropertyChangedDispatcher引发的。

因此,您不需要做任何特殊的操作就可以将Fody.PropertyChanged与Screen、ValidatingModelBase或PropertyChangedBase的任何子类一起使用。

这来自Stylet文档wiki。如果一个项目正在使用Fody.PropertyChange,那么它不必手动编写NotifyOfPropertyChange((,也许这就是为什么您在示例代码中没有看到NotifyOfPropertyChange(。

Fody.PropertyChanged是一个很棒的软件包,试试看,它为我节省了数百万次按键:(

最新更新