none
附加属性与后台字段绑定。设置后台字段的set方法,附加属性的set方法不会自动调用,怎么使其能自动调用? RRS feed

  • 问题

  • 实体基类

       public class BaseEntity: INotifyPropertyChanged
        {
            public event PropertyChangedEventHandler PropertyChanged;
            protected void OnChanged(string propertyName = "")
            {
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
                }
            }
    }

    绑定后台字段

       public class EntityModel: BaseEntity
        {
            private bool _isString;
            public bool isString
            {
                set
                {
                    _isString= value;
                    OnChanged();
                }
                get
                {
                    return _isString;
                }
    
            }
        }

    ViewModel类

            private ObservableCollection<EntityModel> _TreeList;
    
            public ObservableCollection<EntityModel> TreeList
            {
                get { return _TreeList; }
                set { _TreeList= value;
                    this.OnChanged();
                }
            }

    绑定的依赖属性

            public static bool GetIsString(DependencyObject obj)
            {
                return (bool)obj.GetValue(IsStringProperty );
            }
    
            public static void SetIsString(DependencyObject obj, bool value)
            {
         
                obj.SetValue(IsStringProperty , value);
                
                 --值改变时调用的代码
            }
    
    
            public static readonly DependencyProperty IsStringProperty =
                DependencyProperty.RegisterAttached("IsString", typeof(bool), typeof(本类), new PropertyMetadata(null));

    绑定代码(在具体的控件styl内编写的),并且是双向绑定

     <Style  TargetType="{x:Type TreeViewItem}" >

      <Setter Property="c:附加属性所在类.IsString" Value="{Binding isString,Mode=TwoWay}"></Setter>

    </Style>

    如上所示,这是一个TreeViewItem的附加属性,与后台字段,也就是与实体进行绑定,在附加属性值发送改变时,我要做一些处理,如果调用附加属性的set方法,可以改变该附加属性和对应的绑定后台字段,但问题是如果直接调用绑定后台字段的set方法,则不会自动调用附加属性的set方法。这个要如何解决?

    比如使用  如下代码

    EntityModel i = (sender as Button).DataContext as EntityModel
    
    i.isString=false;

    这段代码对isString进行了修改,但绑定该属性的IsStringProperty附加属性未发生更改,也就是未调用set方方法,,怎么能使其设置后台属性也能改变绑定附加属性的值?

    如果反过来,先修改附加属性IsStringProperty的内容,就能根据绑定影响后台字段isString的改变。

    另外后台属性和控件自身的属性绑定,修改也没有出现问题,都是双向的。


    IsString只是个示范字段,实际不叫这个名字,但都是bool类型







    2019年6月27日 8:41

答案


  • Hi   便携式家园,  

    >>,但问题是如果直接调用绑定后台字段的set方法,则不会自动调用附加属性的set方法。这个要如何解决?

    当你直接通过绑定后台字段改变值的时候, 你需要在注册附加属性的时候,一并注册PropertyMetadata来处理变动的值。

     
     public static readonly DependencyProperty IsStringProperty =
                DependencyProperty.RegisterAttached("IsString", typeof(bool), typeof(本类), new PropertyMetadata(null, OnIsStringChanged));
    
            private static void OnIsStringChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
            {
                //bool res= (bool)e.NewValue
               // var element = obj as FrameworkElement;
                
            }    
    
    



    Best regards

    Yong Lu

    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2019年7月1日 8:01
    版主