OnPropertyChanged在WPF中的作用,越详细越好。谢谢了!!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OnPropertyChanged在WPF中的作用,越详细越好。谢谢了!!相关的知识,希望对你有一定的参考价值。

OnPropertyChanged这个属性在WinForm时代就有了,WPF只是向下兼容而已。

WPF使用依赖属性自动通知注册者属性值更变。

OnPropertyChanged需要你在属性值每次变化的时候主动调用一个方法,会引发此事件,当Entity绑定到控件时,控件会主动注册OnPropertyChanged事件,所以属性变化的时候控件会自动更新,这就是数据绑定的基础。
参考技术A OnPropertyChanged 监听属性值的变化 然后前端可以根据值的变化做出一些改变
比如checkbox 当你设定的isCheck值为 false 他就会把勾取消 你再点击一下 他的值变成了True
然后会响应OnPropertyChanged 然后前端的checkbox就会自动有个勾选的状态 如果是类似name,id类的属性 前端当然就不会有什么改变了
参考技术B public string Name

getreturn name;
setname = value;
OnPropertyChanged("Name");


当WPF页面中绑定这个Name属性的时候 在CS代码里面设置Name的属性值的时候OnPropertyChanged会通知页面更新显示最新的这个值
楼上说的也是对的

WPF:多重绑定不使用 OnPropertyChanged 更新?

【中文标题】WPF:多重绑定不使用 OnPropertyChanged 更新?【英文标题】:WPF: Multibinding not updating with OnPropertyChanged? 【发布时间】:2022-01-13 08:20:22 【问题描述】:

我有一个转换器,它接受一个布尔值,并根据它是真还是假返回 A 或 B。转换器根据布尔值选择正确的值,但仅在开始时,如果我在运行时更改布尔值,转换器不会更新。

基本上,我有一个用户控件,其中有一个按钮,这个按钮切换“IsOpen”属性,这很有效。但是我有一个将 IsOpen 绑定到 Image(按钮)的 multibinder,它将根据 IsOpen 切换图像。但它没有更新,只保留开始时的值。 (IsOpen 确实会在点击时切换,这不是问题)

我在哪里进行多重绑定的用户控制:

            <v:IconButton ColorPalette="StaticResource MilkySolid" ColorPaletteFore="StaticResource BlackToBrightPalette" IconMargin="0" Content="" VerticalAlignment="Top" Margin="0" HorizontalAlignment="Left" FontSize="1" Height="26" IconWidth="26"  Click="IconButton_Click">
            <v:IconButton.Image>
                <MultiBinding Converter="StaticResource AorBConverter">
                    <Binding Path="IsOpen"/>
                    <Binding Source="StaticResource collapseBTN"/>
                    <Binding Source="StaticResource expandBTN"/>
                </MultiBinding>
            </v:IconButton.Image>
        </v:IconButton>

CodeBehind(这部分有效)

private void IconButton_Click(object sender, RoutedEventArgs e)
    
        IsOpen = !IsOpen;
    

    public bool IsOpen
    
        get  return (bool)GetValue(IsOpenProperty); 
        set  SetValue(IsOpenProperty, value); 
    

    public static readonly DependencyProperty IsOpenProperty =
    DependencyProperty.Register("IsOpen", typeof(bool),
    typeof(ParamNodeV), new PropertyMetadata(false));

用户控件的视图模型(这也有效)

    public bool IsOpen
    
        get  return isOpen; 
        set
        
            isOpen = value;
            OnPropertyChanged(nameof(IsOpen));
        
    

所以,就像我说的,转换器根据布尔值选择正确的图像。但如果我在运行时更新布尔值,它不会更新。

如果你问我为什么我不只是使用触发器:我正在尝试从我的 UserControl (ParamNodeV) 更改 CustomControl (IconButton) 上的图像,但我不知道如何访问属性来自 ParamNodeV 的 IconButton,没有完全覆盖样式/模板。因此,如果有人帮助我使用转换器或帮助我如何从 UserControl 导航到 IconButton 的 Image 属性,而无需覆盖样式/模板

【问题讨论】:

如果你没有两个同名的属性,这个问题会更清楚。为什么有一个“用户控件的视图模型”?如果控件的 IsOpen 属性绑定到视图模型的 IsOpen 属性,请确保 Binding 是 TwoWay。 【参考方案1】:

表达式

<Binding Path="IsOpen"/>

将当前的 DataContext 作为源对象。

在后面的代码中,您显然更改了 UserControl 的 IsOpen 属性 - 这应该是一个不同的对象。

因此,Binding 应该使用该属性作为源,即使用 UserControl 作为源对象:

<Binding Path="IsOpen" RelativeSource="RelativeSource AncestorType=UserControl"/>

【讨论】:

以上是关于OnPropertyChanged在WPF中的作用,越详细越好。谢谢了!!的主要内容,如果未能解决你的问题,请参考以下文章

在 WPF 中找出 OnPropertyChanged 事件的接收者

WPF:多重绑定不使用 OnPropertyChanged 更新?

在依赖属性 WPF 上使用绑定时出现问题 [重复]

仅查看Model OnPropertyChanged上的更新,但不查看ViewModel OnPropertyChanged中的更新

Xamarin Forms App Shell OnPropertyChanged 未更新 FlyoutHeader 视图

我们应该在UI线程中调用OnPropertyChanged吗?