binding कस्टम निर्भरताओब्जेक्ट्स के लिए बाइंडिंग सेट करें




uwp dependencyobject (2)

मैं वास्तविक वॉडप्रॉपर्टी के लिए कॉल देख रहा हूं बदल गया है, लेकिन वे किसी भी कॉल को चौड़ाईप्रापति परिवर्तित करने के लिए ट्रिगर नहीं कर रहे हैं। मैं क्या खो रहा हूँ?

इस प्रश्न को हल करने के लिए, आपको स्रोत ऑब्जेक्ट पर INotifyPropertyChanged इंटरफ़ेस को कार्यान्वित करने की आवश्यकता होगी ताकि स्रोत परिवर्तन की रिपोर्ट कर सके।

कृपया निम्न कोड देखें:

class WindowsElement : DependencyObject, INotifyPropertyChanged
{
    public WindowsElement()
    {
    }

    public double Width
    {
        get
        {
            return (double)GetValue(WidthProperty);
        }
        set
        {
            SetValue(WidthProperty, value);
        }
    }

    private static void WidthPropertyChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
    {
        WindowsElement element = (WindowsElement)o;
        double width = (double)e.NewValue;
        CommonDebug.LogLine("WPC", element, o, width);
        //element.Width = width;
        element.RaisedPropertyChanged("Width");
    }

    private static void ActualWidthPropertyChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
    {
        WindowsElement element = (WindowsElement)o;
        double width = (double)e.NewValue;
        CommonDebug.LogLine("AWPC", o, e, width, element.Width);
        //element.ActualWidth = width;
        element.RaisedPropertyChanged("ActualWidth");
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void RaisedPropertyChanged(string PropertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(PropertyName));
    }

    public static readonly DependencyProperty WidthProperty = DependencyProperty.Register(
        "Width",
        typeof(double),
        typeof(WindowsElement),
        new PropertyMetadata((double)0, WidthPropertyChanged));

    public double ActualWidth
    {
        get
        {
            return (double)GetValue(ActualWidthProperty);
        }
        set
        {
            SetValue(ActualWidthProperty, value);
        }
    }

    public static readonly DependencyProperty ActualWidthProperty = DependencyProperty.Register(
        "ActualWidth",
        typeof(double),
        typeof(WindowsElement),
        new PropertyMetadata((double)0, ActualWidthPropertyChanged));

    public static void MessWithBindings()
    {
        WindowsElement we1 = new WindowsElement();
        WindowsElement we2 = new WindowsElement();
        var b = new Binding
        {
            Source = we2,
            Path = new PropertyPath("ActualWidth")
        };

        BindingOperations.SetBinding(we1, WindowsElement.WidthProperty, b);
        we2.ActualWidth = 13;
        CommonDebug.LogLine(we1, we1.Width, we1.ActualWidth, we2, we2.Width, we2.ActualWidth);
    }
}

यह एक प्रश्न का एक निरंतरता है: एक कस्टम निर्भरता ऑब्जेक्ट सेटअप करने की कोशिश कर रहा है स्पष्ट रूप से कुछ याद आ रही है मूल प्रश्न को संपादित करना व्यावहारिक नहीं है; परिवर्तन बहुत महान हैं इसलिए मैं एक नया सवाल शुरू कर रहा हूं।

मैं अपने UWP ऐप में कस्टम निर्भरता ऑब्जेक्ट्स के बीच बाइंडिंग सेटअप करने की कोशिश कर रहा हूं संबंधित कोड नीचे है मैं वास्तविक वॉडप्रॉपर्टी के लिए कॉल देख रहा हूं बदल गया है, लेकिन वे किसी भी कॉल को चौड़ाईप्रापति परिवर्तित करने के लिए ट्रिगर नहीं कर रहे हैं। मैं क्या खो रहा हूँ?

class WindowsElement: DependencyObject
{
    public WindowsElement()
    {
    }
    public double Width
    {
        get
        {
          return (double)GetValue(WidthProperty);
        }
        set
        {
          SetValue(WidthProperty, value);
        }
    }

    private static void WidthPropertyChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
    {
      WindowsElement element = (WindowsElement)o;
      double width = (double)e.NewValue;
      CommonDebug.LogLine("WPC", element, o, width);
      element.Width = width;
    }

   private static void ActualWidthPropertyChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
     {
       WindowsElement element = (WindowsElement)o;
       double width = (double)e.NewValue;
       CommonDebug.LogLine("AWPC", o, e, width, element.Width);
       element.ActualWidth = width;
     }
     public static readonly DependencyProperty WidthProperty = DependencyProperty.Register(
        "Width",
        typeof(double),
        typeof(WindowsElement),
       new PropertyMetadata((double)0, WidthPropertyChanged));

      public double ActualWidth {
        get
          {
            return (double)GetValue(ActualWidthProperty);
          }
        set
            {
              SetValue(ActualWidthProperty, value);
            }
        }


    public static readonly DependencyProperty ActualWidthProperty =  
      DependencyProperty.Register(
        "ActualWidth",
        typeof(double),
        typeof(WindowsElement),
        new PropertyMetadata((double)0, ActualWidthPropertyChanged));


    public static void MessWithBindings()
    {
        WindowsElement we1 = new WindowsElement();
        WindowsElement we2 = new WindowsElement();
        var b = new Binding
          {
            Source = we2,
            Path = new PropertyPath("ActualWidth")
          };

        BindingOperations.SetBinding(we1, WindowsElement.WidthProperty, b);
        we2.ActualWidth = 13;
        CommonDebug.LogLine(we1, we1.Width,  we1.ActualWidth, we2, we2.Width, we2.ActualWidth);
    }
}

सुनिश्चित नहीं है कि यूडब्ल्यूपी में एक निर्भरता संपत्ति से एक दूसरे के लिए बाइंडिंग में स्वचालित रूप से लक्ष्य संपत्ति को अद्यतन नहीं करता है (जैसा कि WPF में होता है)।

हालांकि, आप बस बाइंडिंग की दिशा वापस कर सकते हैं और इसे दो तरह से बना सकते हैं:

var b = new Binding
{
    Source = we1,
    Path = new PropertyPath("Width"),
    Mode = BindingMode.TwoWay
};

BindingOperations.SetBinding(we2, WindowsElement.ActualWidthProperty, b);
we2.ActualWidth = 13;