使用样式表
我使用的是带有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是一个很棒的软件包,试试看,它为我节省了数百万次按键:(