arcardia - Do 02.10.08 15:15
Titel: Binding für MenuItems Header Text
Hi
Hab ein kleines Binding Problem in meinem UserControl
dieses enthält ein ContextMenu dessen Header Text ich als Depency Property nach aussen führen wollte
um diesen von extern ändern zu können
Leider funzt das Binding nicht mit dem MenuItem , wohl aber mit einer Textbox untendrunter.
Meine nächste Vermutung war es das der Header vom Typ Object ist und dieser mit einem String Property
nichts anfangen kann aber auch eine TextBox innerhalb des MenuItems brachte keinen Erfolg
Hier mal der XAML Code vom UserControl
XML-Daten
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| <UserControl x:Class="BindingTest.myControl" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Name="meincontrol" Height="300" Width="300"> <Grid Background="Red"> <Grid.ContextMenu> <ContextMenu> <MenuItem Header="{Binding ElementName=meincontrol, Path=MeinText}"/> </ContextMenu> </Grid.ContextMenu> <TextBlock Text="{Binding ElementName=meincontrol, Path=MeinText}"/> </Grid> </UserControl> |
Und hier mal das Property C# Code
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| public static readonly DependencyProperty MeinTextProperty = DependencyProperty.Register("MeinText", typeof(string), typeof(myControl), new FrameworkPropertyMetadata("Hello World")); [TypeConverter(typeof(StringConverter))] public string MeinText { get { return (string)base.GetValue(MeinTextProperty); } set { base.SetValue(MeinTextProperty, value); } } |
Jemand ne Idee was im Binding oben geändert werden muss ?
Hab da derzeit nicht wirklich nen Plan von ;)
Moderiert von
Christian S.: Code- durch Xml- und C#-Tags ersetzt
Kha - Do 02.10.08 22:51
Sieht dummerweise so aus, als ob der Header explizit auf null gesetzt würde, wenn man ihm nichts zuweist. Dieser Wert hat damit Vorrang vor Bindings, ergo lässt sich HeaderProperty anscheinend überhaupt nicht binden. Zwei Möglichkeiten, die mir gerade einfallen:
- Nimm eine ganz normale Property und setze den Header im Setter. Wenn du aber unbedingt eine DP brauchst:
- Benutze DependencyObject.ClearValue, allerdings nicht zu früh (:nut:) .
Kha - Sa 04.10.08 16:02
arcardia hat folgendes geschrieben : |
Ich vermute mal eher[...] |
Das war keine Vermutung von mir ;) . In
HeaderedItemsControl.PrepareHeaderedItemsControl steht (warum auch immer) ein
this.Header = null;, danach hast mit Data Binding du keine Chance mehr.