修改 DependencyObject 类成员时未触发 PropertyChangedCallback

问题描述 投票:0回答:1

我创建了一个

DependencyObject
,其中包含属性,我还让它继承了
INotifyPropertyChanged

但是当它作为

DependencyProperty
实现时,当我在设计和代码中更改
PropertyChangedCallback
中的单个属性时,它不会触发
DependencyObject

这是我将用于我的

CustomControl
的依赖对象。

public class Basemap : DependencyObject, INotifyPropertyChanged
{
    private string identifier;
    private string name;
    private string alias;
    private string url;

    private Map.DetailRange detailrange;
    private Map.Attribution attribution;

    public string Identifier
    {
        get => identifier;
        set
        {
            identifier = value;
            OnPropertyChanged("Identifier");
        }
    }

    public string Name
    {
        get => name;
        set
        {
            name = value;
            OnPropertyChanged("Name");
        }
    }

    public string Alias
    {
        get => alias;
        set
        {
            alias = value;
            OnPropertyChanged("Alias");
        }
    }

    public string URL
    {
        get => url;
        set
        {
            url = value;
            OnPropertyChanged("URL");
        }
    }

    public Map.DetailRange DetailRange
    {
        get => detailrange;
        set
        {
            detailrange = value;
            OnPropertyChanged("DetailRange");
        }
    }

    public Map.Attribution Attribution
    {
        get => attribution;
        set
        {
            attribution = value;
            OnPropertyChanged("Attribution");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged([CallerMemberName] string name = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
    }
}

它有一个

PropertyChangedEventHandler
并在调用
OnPropertyChanged
时调用它,就像在这个 GUIDE

中一样

这就是我在具有

DependecyProperty
CustomControl
中实现的
PropertyChangedCallback

public static DependencyProperty BasemapProperty = DependencyProperty.Register("Basemap", typeof(Basemap), typeof(Browser), new PropertyMetadata(null, BasemapChanged));
private static void BasemapChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    Debug.WriteLine("Basemap Changed");
}

但是当单个属性的值改变时,

PropertyChangedCallback
不会被触发,而只有当整个
DependecyObject
被更新或插入时才会触发。无论是设计还是代码

<Window.Resources>
    <mMAP:Basemap x:Key="OpenStreetMap" 
                      Identifier="OpenStreetMap.Standard"
                      Name="OpenStreetMap Standard" 
                      Alias="OpenStreetMap" 
                      URL="https://tile.openstreetmap.org/{z}/{x}/{y}.png" 
                      DetailRange="0,0,18"
                      Attribution="© OpenStreetMap contributors, CC-BY-SA" />
</Window.Resources>

任何人都可以对此提出任何修复建议吗?

谢谢你。

编辑:我将

PropertyChanged
事件从
DependecyObject
分配给控件:

Basemap.PropertyChanged += Basemap_PropertyChanged;

因此每次

DependecyObject
类的任何成员都可以触发它。对 WPF 这样做可能是亵渎的,但对我来说是有效的。

PS:我需要将它分组,因为它是

CustomControl
的配置。

c# wpf-controls dependencyobject
1个回答
0
投票

您没有绑定到您在控件中定义的依赖属性,这就是为什么

PropertyChangedCallback
BasemapChanged
不会被触发。

虽然它在某些情况下有效,但我尝试避免在控件上实现

INotifyPropertyChanged
接口,并在需要绑定时仅使用依赖属性。

public static DependencyProperty AliasProperty = DependencyProperty.Register(
    nameof(Alias),
    typeof(string),
    typeof(Basemap),
    new PropertyMetadata(null, AliasPropertyChangedCallback));

public string Alias
{
    get { return (string)GetValue(Alias); }
    set { SetValue(Alias, value); }
}

private static void AliasPropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    Debug.WriteLine($"New Value of Alias: {e.NewValue}");
}

请参阅:依赖属性概述 (WPF .NET)

© www.soinside.com 2019 - 2024. All rights reserved.