Avalonia中如何让依赖其他属性的计算属性OneWay绑定生效?
解决Avalonia计算属性OneWay绑定不更新的问题
问题核心是:计算属性EndButtonVisible依赖CurrentDayState,但CurrentDayState变化时,EndButtonVisible没有通知UI自身值已改变。Avalonia的绑定系统靠INotifyPropertyChanged接口的PropertyChanged事件感知属性变化,你的计算属性是只读表达式体,不会主动触发该事件,所以UI仅在初始加载时读取一次值。
方法一:在CurrentDayState变更时触发EndButtonVisible的通知
修改CurrentDayState的setter,在值更新后,额外触发EndButtonVisible的PropertyChanged事件,告诉UI重新读取该属性的值:
public WorkDayState CurrentDayState { get => _currentDayState; set { if (this.RaiseAndSetIfChanged(ref _currentDayState, value)) { // 通知UI EndButtonVisible的值已变更 this.RaisePropertyChanged(nameof(EndButtonVisible)); } } }
方法二:将计算属性改为带通知的普通属性
如果偏好更显式的写法,可以把EndButtonVisible改成普通属性,在CurrentDayState变化时主动更新它并触发通知:
private bool _endButtonVisible; public bool EndButtonVisible { get => _endButtonVisible; private set => this.RaiseAndSetIfChanged(ref _endButtonVisible, value); } public WorkDayState CurrentDayState { get => _currentDayState; set { if (this.RaiseAndSetIfChanged(ref _currentDayState, value)) { // 根据CurrentDayState更新EndButtonVisible的值 EndButtonVisible = CurrentDayState == WorkDayState.Ended; } } }
额外提示:命令的规范写法
你的ChangeStateCommand目前是普通方法,建议使用Avalonia推荐的RelayCommand实现ICommand接口,这是MVVM模式的标准做法:
public ICommand ChangeStateCommand { get; } public MainViewModel() { ChangeStateCommand = new RelayCommand(ExecuteChangeState); } private void ExecuteChangeState() { WorkDayState newState; switch (CurrentDayState) { case WorkDayState.Suspended: case WorkDayState.Ended: default: newState = WorkDayState.Started; break; case WorkDayState.Started: newState = WorkDayState.Suspended; break; } CurrentDayState = newState; }
内容的提问来源于stack exchange,提问作者user571203
相关产品推荐
相关产品推荐

