我创建了一个
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
的配置。
您没有绑定到您在控件中定义的依赖属性,这就是为什么
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}");
}