为了账号安全,请及时绑定邮箱和手机立即绑定

是否有类似于 RegisterClassHandler 的 DependencyProperty

是否有类似于 RegisterClassHandler 的 DependencyProperty

C#
神不在的星期二 2021-07-16 10:06:36
我知道您可以使用EventManager该类将类处理程序注册到路由事件,以便在为该类对象触发该事件时使类的所有实例做出响应:EventManager.RegisterClassHandler( typeof( TextBox ), Control.MouseDoubleClickEvent,    new RoutedEventHandler( ( S, E ) => ( E.OriginalSource as TextBox )?.SelectAll( ) ) );我正在寻找的是一种方法来做类似的事情,附加DependencyProperty到DataBinding使用该特定属性的控件类型的所有实例。符合最小、完整和可验证示例要求...应用程序.xaml.cs:using System;using System.ComponentModel;using System.Windows;using System.Windows.Controls;namespace MCVE {    /// <summary>    /// Interaction logic for App.xaml    /// </summary>    public partial class App : INotifyPropertyChanged {        public static readonly DependencyProperty FooProperty;        public event PropertyChangedEventHandler PropertyChanged;        static App( ) {            EventManager.RegisterClassHandler(                typeof( TextBox ), Control.MouseDoubleClickEvent,                new RoutedEventHandler(                    ( S, E ) => ( E.OriginalSource as TextBox )?.SelectAll( ) ) );            FooProperty = DependencyProperty.RegisterAttached(                    "Foo", typeof( string ), typeof( App) );            //Is it possible to bind the FooProperty of all Window objects to            //the FooSource property defined below in similar fashion             //to how one can call RegisterClassHandler above?        }        [STAThread]        public static int Main( ) {            App program = new App( );            program.InitializeComponent( );            return program.Run( );        }        protected override void OnStartup( StartupEventArgs e ) {            this.FooSource = "Baz";            base.OnStartup( e );        }        public static string GetFoo( Window w ) =>            w.GetValue( FooProperty ).ToString( );        public static void SetFoo( Window w, string value ) =>            w.SetValue( FooProperty, value );因此,所需的行为是,在启动程序后,之后创建的任何窗口都将通过某些数据绑定行为将FooProperty值设置为"Baz"(这样,如果FooSource属性更改,则每个窗口FooProperty属性也将更改)。这可能吗?
查看完整描述

1 回答

?
胡子哥哥

TA贡献1825条经验 获得超6个赞

您只需要Window.Loaded在App的构造函数中为event再添加一个事件处理程序。


private App()

{

    EventManager.ResisterClassHandler(typeof(Window), Window.LoadedEvent,

        (RoutedEventHandler)((s, e) =>

            ((Windows)s).SetBinding(FooProperty, new Binding("FooSource")

            {

                Source = this,

            }

        ));

}

而且我相信这只是一个不小心的错过,主人类型FooProperty应该是typeof(App)但不是typeof(Window)。


查看完整回答
反对 回复 2021-07-18
  • 1 回答
  • 0 关注
  • 191 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信