我正在编写一个继承ItemsControl的自定义控件。我需要在某些属性发生变化时调用方法。对于我自己的依赖属性,我可以在setter中调用它没问题,但对于像ItemsSource这样的继承,我不知道如何做到这一点,我想学习如何不重写整个事情。
在搜索时,我看到mention这可以通过WPF中的OverrideMetadata完成(我的项目是UWP)。我看到如何使用OverrideMetadata来更改默认值,但我不知道它如何用作属性更改通知。
答案 0 :(得分:4)
UWP中有一种名为 var config = {
server: 'servername.database.windows.net',
database: 'myDatabase',
user: 'user',
password: 'password',
port: 1433
};
var sql = require("mssql");
var connection = new sql.Connection(config);
的新方法,专为此而设计。例如,以下是我如何删除扩展RegisterPropertyChangedCallback
控件中的默认入口转换。
GridView
您可以使用// Remove the default entrance transition if existed.
RegisterPropertyChangedCallback(ItemContainerTransitionsProperty, (s, e) =>
{
var entranceThemeTransition = ItemContainerTransitions.OfType<EntranceThemeTransition>().SingleOrDefault();
if (entranceThemeTransition != null)
{
ItemContainerTransitions.Remove(entranceThemeTransition);
}
})
取消注册。
可以找到更多信息here。
答案 1 :(得分:0)
对于ItemsSource
属性,您可以覆盖OnItemsSourceChanged
方法,但对于任何其他依赖项属性,您可以使用DependencyPropertyDescriptor
:
public class MyItemsControl : ItemsControl
{
public MyItemsControl()
{
DependencyPropertyDescriptor dpd = DependencyPropertyDescriptor
.FromProperty(ItemsControl.ItemsSourceProperty, typeof(ItemsControl));
if (dpd != null)
{
dpd.AddValueChanged(this, OnMyItemsSourceChange);
}
}
private void OnMyItemsSourceChange(object sender, EventArgs e)
{
//...
}
}
这适用于WPF。在UWP应用程序中,您应该能够使用@Thomas Levesque的DependencyPropertyWatcher
课程:https://www.thomaslevesque.com/2013/04/21/detecting-dependency-property-changes-in-winrt/