自定义控件:如何在继承的依赖项属性更改时调用方法?

时间:2017-06-15 12:30:09

标签: c# .net wpf xaml uwp

我正在编写一个继承ItemsControl的自定义控件。我需要在某些属性发生变化时调用方法。对于我自己的依赖属性,我可以在setter中调用它没问题,但对于像ItemsSource这样的继承,我不知道如何做到这一点,我想学习如何不重写整个事情。

在搜索时,我看到mention这可以通过WPF中的OverrideMetadata完成(我的项目是UWP)。我看到如何使用OverrideMetadata来更改默认值,但我不知道它如何用作属性更改通知。

2 个答案:

答案 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/