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
Hallo s0h0,
Hast du schoneinmal versucht dein binding mittel x:Key zu adressieren?
Tipp:
<TextBox Text="85" x:Key="tb_value" />
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
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
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.
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
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
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