Benutzer mit den meisten Antworten
UserControl und Dependency Property

Frage
-
Hallo! Ich habe ein Problem, und es treibt mich zum Wahnsinn. Ich habe ein UserControl erstellt. Dieses UserControl besitzt mehrere Depedency Properties. Eins davon ist das hier:
public static readonly DependencyProperty ViewFinderVisibilityProperty = DependencyProperty.Register("ViewFinderVisibility", typeof(bool), typeof(ZoomDrawImageBox), new PropertyMetadata(true, ViewFinderVisibilityPropertyCallback, null), null); private static void ViewFinderVisibilityPropertyCallback(DependencyObject sender, DependencyPropertyChangedEventArgs args) { var desk= sender as Desk; if (args.NewValue == args.OldValue) return; if (desk!= null) desk.ViewFinderVisibility = (bool)args.NewValue; } public bool ViewFinderVisibility { get { return (bool)GetValue(ViewFinderVisibilityProperty); } set { SetValue(ViewFinderVisibilityProperty, value); } }
Diese ist in meinem XAML des UserControls gebunden:
<Desk Grid.Row="0" x:Name="Desk" ViewFinderVisibility="{Binding Path=ViewFinderVisibility}">
Ich erstelle jetzt eine neue XAML-Page und binde das UserControl Desk ein. In diesem binde ich jetzt das DependencyProperty an mein ViewModel.
Im Constructor meines UserControls setzt ich ViewFinderVisibility auf true, und erwarte, dass dieses in meinem ViewModel (wegen dem Binding) ebenfalls auf true gesetzt wird. Aber dem ist nicht so.
Begehe ich einen Denkfehler, oder wie schaffe ich es, dass die Bindung in beide Richtungen funktioniert?
Danke für die Hilfe!
Antworten
-
Hallo, nur um sicher zustellen, das ich deinen Aufbau richtig verstehe. Du hast ein UserControl mit DP's. In der gezeigten Deklaration steht
typeof(ZoomDrawImageBox)
Aber im XAML steht
<Desk
Das würde so nur funktionieren, wenn eine Klasse von der anderen Erbt. Sonst müsste ein Laufzeitfehler kommen. Vieleicht verstehe ich aber auch etwas falsch.
Den Standartwert setzt man normalerweise über die PropertyMetadata. Das hast du ja auch getan.Zum Problem mal ein vereinfachtes Beispiel mit 2 CheckBoxen. Es gibt cb1 und cb2. CheckBoxen sind Standartmäßig Unchecked. Nun bindest du cb1 an cb2. Der Standartbindungstyp ist TwoWay. Also du änderst cb1 und cb2 ändert sich auch und anders herum. Wenn du nun den Mode auf OneWayToSource stellst, dann reagiert nurnoch cb1 auf cb2. Zur verdeutlichung mal ein Codebeispiel:
<StackPanel> <CheckBox x:Name="cb1" Content="CheckBox1" /> <CheckBox x:Name="cb2" Content="CheckBox2" IsChecked="{Binding IsChecked, ElementName=cb1, Mode=OneWayToSource}"/> <CheckBox x:Name="cb3" Content="CheckBox3" /> <CheckBox x:Name="cb4" Content="CheckBox4" IsChecked="{Binding IsChecked, ElementName=cb3}"/> </StackPanel>
Dabei interagieren cb1 mit cb2 und cb3 mit cb4. Für dich heißt das, das du die CB an dein Steuerelement binden musst. So orientiert sich die ChekBox an deinen Vorgaben.
<Code:13/> - Koopakiller [kuːpakɪllɐ]
Webseite | Code Beispiele | Facebook | Snippets
Wenn die Frage beantwortet ist, dann markiert die hilfreichsten Beiträge als Antwort und bewertet die Beiträge. Danke.
Einen Konverter zwischen C# und VB.NET Code gibt es hier.- Als Antwort markiert Marcel RomaModerator Donnerstag, 6. Juni 2013 04:47
Alle Antworten
-
Hallo, nur um sicher zustellen, das ich deinen Aufbau richtig verstehe. Du hast ein UserControl mit DP's. In der gezeigten Deklaration steht
typeof(ZoomDrawImageBox)
Aber im XAML steht
<Desk
Das würde so nur funktionieren, wenn eine Klasse von der anderen Erbt. Sonst müsste ein Laufzeitfehler kommen. Vieleicht verstehe ich aber auch etwas falsch.
Den Standartwert setzt man normalerweise über die PropertyMetadata. Das hast du ja auch getan.Zum Problem mal ein vereinfachtes Beispiel mit 2 CheckBoxen. Es gibt cb1 und cb2. CheckBoxen sind Standartmäßig Unchecked. Nun bindest du cb1 an cb2. Der Standartbindungstyp ist TwoWay. Also du änderst cb1 und cb2 ändert sich auch und anders herum. Wenn du nun den Mode auf OneWayToSource stellst, dann reagiert nurnoch cb1 auf cb2. Zur verdeutlichung mal ein Codebeispiel:
<StackPanel> <CheckBox x:Name="cb1" Content="CheckBox1" /> <CheckBox x:Name="cb2" Content="CheckBox2" IsChecked="{Binding IsChecked, ElementName=cb1, Mode=OneWayToSource}"/> <CheckBox x:Name="cb3" Content="CheckBox3" /> <CheckBox x:Name="cb4" Content="CheckBox4" IsChecked="{Binding IsChecked, ElementName=cb3}"/> </StackPanel>
Dabei interagieren cb1 mit cb2 und cb3 mit cb4. Für dich heißt das, das du die CB an dein Steuerelement binden musst. So orientiert sich die ChekBox an deinen Vorgaben.
<Code:13/> - Koopakiller [kuːpakɪllɐ]
Webseite | Code Beispiele | Facebook | Snippets
Wenn die Frage beantwortet ist, dann markiert die hilfreichsten Beiträge als Antwort und bewertet die Beiträge. Danke.
Einen Konverter zwischen C# und VB.NET Code gibt es hier.- Als Antwort markiert Marcel RomaModerator Donnerstag, 6. Juni 2013 04:47