[WPF源码分析]ContentControl依赖项属性的双向绑定,two-way binding view's DependencyProperty and ViewModel's

Posted 致林

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[WPF源码分析]ContentControl依赖项属性的双向绑定,two-way binding view's DependencyProperty and ViewModel's 相关的知识,希望对你有一定的参考价值。

问题:自定义控件的依赖项属性和VIewModel中的变量不能双向绑定

解决思路:对比.net源码 PresentationFramework  /   System.Windows.Controls

原因:定义依赖项属性时没有设置OnChanged方法

解决方法:初始化时绑定Changed方法

.net 源码如下:

/// <summary>
        ///     The DependencyProperty for the Content property.
        ///     Flags:              None
        ///     Default Value:      null
        /// </summary>
        [CommonDependencyProperty]
        public static readonly DependencyProperty ContentProperty =
                DependencyProperty.Register(
                        "Content",
                        typeof(object),
                        typeof(ContentControl),
                        new FrameworkPropertyMetadata(
                                (object)null,
                                new PropertyChangedCallback(OnContentChanged)));
 
        /// <summary>
        ///     Content is the data used to generate the child elements of this control.
        /// </summary>
        [Bindable(true), CustomCategory("Content")]
        public object Content
        {
            get { return GetValue(ContentProperty); }
            set { SetValue(ContentProperty, value); }
        }
 
        /// <summary>
        ///     Called when ContentProperty is invalidated on "d."
        /// </summary>
        private static void OnContentChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            // 根据需要实现自己的方法 
            ContentControl ctrl = (ContentControl) d;
            ctrl.SetValue(HasContentPropertyKey, (e.NewValue != null) ? BooleanBoxes.TrueBox : BooleanBoxes.FalseBox);
 
            ctrl.OnContentChanged(e.OldValue, e.NewValue);
        }
 

 

以上是关于[WPF源码分析]ContentControl依赖项属性的双向绑定,two-way binding view's DependencyProperty and ViewModel's 的主要内容,如果未能解决你的问题,请参考以下文章

[WPF自定义控件]从ContentControl开始入门自定义控件

带有 DataTemplate 的 ContentControl 不显示任何内容(WPF MVVM)

使用 ContentControl 在 WPF 中显示视图不起作用

c#WPF删除contentcontrol

WPF MVVM 为啥使用 ContentControl + DataTemplate 视图而不是直接的 XAML 窗口视图?

TabControl 内的 WPF ContentControl 不显示 DataTemplates