为了账号安全,请及时绑定邮箱和手机立即绑定

数据绑定更新但视图不是

数据绑定更新但视图不是

C#
手掌心 2021-07-12 13:06:09
我有一个属性 ( FileName ),当我在调试器中观察它时更新得很好(同时在视图模型和 XAML 中悬停在属性上),但 UI 不会反映值更新。我设置了一个断点set { this.MutateVerbose(ref _fileName, value, RaisePropertyChanged()); },可以观察它进入它并通过RaisePropertyChanged().我通过 将其实例化为“未更新”的初始值FileName = "Not Updated";,虽然该属性通过应用程序的运行持续时间成功更新为其他值FileName = SelectRandomString();,但 UI 永远不会更新。相关界面代码:                            <TextBlock Text="{Binding FileName}" HorizontalAlignment="Center">                            <TextBlock.DataContext>                                <ns:ProgressViewModel />                            </TextBlock.DataContext>                        </TextBlock>MutateVerbose 的代码:        public static void MutateVerbose<TField>(this INotifyPropertyChanged instance, ref TField field, TField newValue, Action<PropertyChangedEventArgs> raise, [CallerMemberName] string propertyName = null)        {        if (EqualityComparer<TField>.Default.Equals(field, newValue)) return;        field = newValue;        raise?.Invoke(new PropertyChangedEventArgs(propertyName));        }更新:如果我将进度计时器作为视图模型加载的一部分启动,如下所示:        public ProgressViewModel()        {        KickOffProgressTimer();        }用户界面按原样更新。但我不理解这种行为,这是不可取的。我不希望该KickOffProgressTimer();方法在应用程序启动后立即执行,而是仅在从后面的主窗口代码中单击按钮时执行:        private void CircleButtonClick(object sender, RoutedEventArgs e)        {           ProgressViewModel pvm = new ProgressViewModel();           CircleButton.DataContext = pvm;           pvm.KickOffProgressTimer();        }
查看完整描述

2 回答

?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

您需要指定UpdateSourceTrigger将触发 UI 更新的事件:

<TextBlock Text="{Binding FileName, UpdateSourceTrigger=PropertyChanged}" ...


查看完整回答
反对 回复 2021-07-18
  • 2 回答
  • 0 关注
  • 202 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信