Laden...

Attached Property mit CustomClass Liste, Bind to child property?

Erstellt von s0h0 vor 10 Jahren Letzter Beitrag vor 10 Jahren 1.541 Views
S
s0h0 Themenstarter:in
683 Beiträge seit 2006
vor 10 Jahren
Attached Property mit CustomClass Liste, Bind to child property?

Hallo,

ich habe eine Liste als attached property. Die Liste besteht aus einer CustomClass.
Im Xaml Code würde ich gerne eine dieser Properties zu einer TextBox binden.

Wenn ich das versuche, kriege ich kein update der Textbox durchgereicht. Die Set Methode wird nie aufgerufen, daher denke ich das Binding geht verloren.

Hat jemand eine Idee dazu?

CustomClass


    public class ComparsionCondition : DependencyObject, INotifyPropertyChanged
    {
        public static readonly DependencyProperty BindingValueProperty =
             DependencyProperty.Register("BindingValue", typeof(string),
             typeof(ComparsionCondition), new PropertyMetadata("bindval"));

        public string BindingValue 
        {
            get
            {
                return (string)GetValue(BindingValueProperty);
            }
            set
            {
                SetValue(BindingValueProperty, value);
                OnPropertyChanged("BindingValue");
            }
        }

        #region INotifyPropertyChanged Member

        public event PropertyChangedEventHandler PropertyChanged;
        protected virtual void OnPropertyChanged(string propertyName) 
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
        }

        #endregion
    }

Behavior:


 public static class ComparsionBehavior 
    {
        #region ComparsionConditions
        public static TrulyObservableCollection<ComparsionCondition> GetComparsionConditions(DependencyObject frameworkElement)
        {
            return (TrulyObservableCollection<ComparsionCondition>)frameworkElement.GetValue(ComparsionConditionsProperty);
        }

        public static void SetComparsionConditions(DependencyObject frameworkElement, TrulyObservableCollection<ComparsionCondition> value) 
        {
            frameworkElement.SetValue(ComparsionConditionsProperty, value);
        }

        public static readonly DependencyProperty ComparsionConditionsProperty = DependencyProperty.RegisterAttached(
            "ComparsionConditions", typeof(TrulyObservableCollection<ComparsionCondition>), typeof(ComparsionBehavior), new UIPropertyMetadata(new TrulyObservableCollection<ComparsionCondition>(), OnComparsionConditionsChanged));

        static void OnComparsionConditionsChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) 
        {
            HandlePropertyChanged(sender);
        }
        #endregion
    }

XAML usage


<TextBox Text="85" x:Name="tb_value"></TextBox>
 <Border>
                <Behavior:ComparsionBehavior.ComparsionConditions>
                    <Behavior:ComparsionCondition BindingValue="{Binding Path=Text, ElementName=tb_value}">
                    </Behavior:ComparsionCondition>
                </Behavior:ComparsionBehavior.ComparsionConditions>
 </Border>

Eine Null kann ein bestehendes Problem verzehnfachen

R
212 Beiträge seit 2012
vor 10 Jahren

Hallo s0h0,

Hast du schoneinmal versucht dein binding mittel x:Key zu adressieren?

Tipp:
<TextBox Text="85" x:Key="tb_value" />

S
s0h0 Themenstarter:in
683 Beiträge seit 2006
vor 10 Jahren

Hallo,

danke für deine Antwort. Key ist nur in RessourceDictionaries erlaubt. Ich denke aber auch nicht das das helfen würde.

Viele Grüße,

Simon

Eine Null kann ein bestehendes Problem verzehnfachen

J
641 Beiträge seit 2007
vor 10 Jahren

lass mal das INotifyProperty Changed weg, das nutzt man nicht bei Dependecy Properties (geht nicht) und Registrier dein CallBack in dn Property Metadaten!
http://msdn.microsoft.com/en-us/library/ms745795.aspx#Coerce_Value_Callbacks_and_Property_Changed_Events

cSharp Projekte : https://github.com/jogibear9988

5.299 Beiträge seit 2008
vor 10 Jahren

ich sehs grad annersrum: Lass das Erben von DependancyObject weg, und verwende zur Benachrichtigung den INotifyPropertyChanged-Pattern.

Von DependancyObject sollten glaub nur Klassen erben, die darauf ausgelegt werden, im Xaml instanziert zu werden.

auf jeden fall: DependancyObject und INOtifyPropertyChanged ist doppelt gemoppelt.

Der frühe Apfel fängt den Wurm.

S
s0h0 Themenstarter:in
683 Beiträge seit 2006
vor 10 Jahren

Nur mit DependencyObject geht es auch nicht. Aber ich sehe das der Setter für BindingValue in der ComparsionCondition Klasse nie gecalled wird. Obwohl ich den Wert im XAML setze??

Hat jemand eine Idee warum der Wert nie gesetzt wird?

Eine Null kann ein bestehendes Problem verzehnfachen

S
s0h0 Themenstarter:in
683 Beiträge seit 2006
vor 10 Jahren

Ok, also wenn ich einfach einen statischen Text festlege wird die PropertyChangedCallback methode gecalled. In Snoop sehe ich das die Property leer ist, wenn ich sie mit snoop setze wird der callback ebenfalls gefeuert. Nur mit einem Binding bleibt die Property immer leer...

Eine Null kann ein bestehendes Problem verzehnfachen

S
s0h0 Themenstarter:in
683 Beiträge seit 2006
vor 10 Jahren

FreezableCollection und das binding mit x:Reference war die Lösung...

BindingValue="{Binding Path=Text, Source={x:Reference tb_value} }"

Danke!

Eine Null kann ein bestehendes Problem verzehnfachen