Laden...

WPF: Binding mit RelativeSource - FindAncestor

Erstellt von Robin0 vor 9 Jahren Letzter Beitrag vor 9 Jahren 8.914 Views
R
Robin0 Themenstarter:in
212 Beiträge seit 2012
vor 9 Jahren
WPF: Binding mit RelativeSource - FindAncestor

Hallo,

Es geht um das Binding des Buttons der unten aufgeführt wird. Ich versuche auf ein wert im DataContext des UserControls zu Binden, nurleider wird das Binding nie aufgelöst(Der Command ausgeführt wenn ich draufklick). *Der pfad des Bindings ist korrekt.

Meine frage nun, wie komme ich mit dem Binding auf mein UserControl

Im ausgabefenster des Debuggers erhalte ich beim klicken des Buttons folgende meldungen:
Eine Ausnahme (erste Chance) des Typs "System.InvalidCastException" ist in mscorlib.dll aufgetreten.
Eine Ausnahme (erste Chance) des Typs "System.ArgumentException" ist in mscorlib.dll aufgetreten.


<UserControl>
    <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
            <ListBox x:Name="lb" ItemsSource="{Binding Items,
                                        UpdateSourceTrigger=PropertyChanged, NotifyOnSourceUpdated=True, Mode=TwoWay}"
                 HorizontalAlignment="Stretch"
                 VerticalAlignment="Stretch"
                 Grid.Row="0">
                <ListBox.ItemContainerStyle>
                    <Style TargetType="{x:Type ListBoxItem}">
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate>
                                                <Border BorderThickness="1" BorderBrush="{DynamicResource Accent}"  CornerRadius="5,5,5,0" Margin="0,0,0,5">
                                                    <Expander ExpandDirection="Down" IsExpanded="False">
                                                        <Expander.Header>
                                                            <StackPanel Orientation="Vertical" AllowDrop="True">
                                                                <StackPanel Orientation="Horizontal">
                                                                    <StackPanel Orientation="Horizontal" Margin="0,0,20,0">                                                           
                                                                    <Button 
                                                                            Foreground="{DynamicResource Accent}"
                                                                            ToolTip="{trans:Translation Add}"
                                                                            Command="{Binding Path=DataContext.Command_Action, RelativeSource={RelativeSource AncestorLevel=1, Mode=FindAncestor, AncestorType={x:Type UserControl}}}" CommandParameter="Add"
                                                                         />
                                                                    
                                                                </StackPanel>
                                                            </StackPanel>
</stackPannel>
                                                        </Expander.Header>
                                                        <Expander.Content>
<!--Content-->
                                                       </Expander.Content>
                                        </Expander>
                                    </Border>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </ListBox.ItemContainerStyle>
            </ListBox>
        </ScrollViewer>
</UserControl>

2.207 Beiträge seit 2011
vor 9 Jahren

Hallo Robin0,

verwende statt DynamicResource besser StaticResource. Es gibt in den seltensten Fällen die Notwendigkeit einer DynamicResource. Ausserdem knallts dann, wenn er was nicht findet und du findest Fehler schneller.

nurleider wird das Binding nie aufgelöst(Der Command ausgeführt wenn ich draufklick).

Wird das Binding nun aufgelöst und das Command ausgeführt? Oder wird es nicht aufgelöst und das Command nicht ausgeführt?

Lass bei deinem Binding mal das AncestorLevel weg. Bin nicht sicher, ob es wirklich daran liegt. Aber sonst machst du viel richtig ("DataContext. ..." im Binding und die RelativeSource sieht auch nicht schlecht aus).

Weiter sieht eine InvalidCastException / ArgumentException eher nach Probleme mit dem CommandParameter aus. Da mal nachgeschaut?

Gruss

Coffeebean

T
314 Beiträge seit 2013
vor 9 Jahren

Was mir noch auffällt.... Command_Action heißt das Command tatsächlich so? Dann ok, klingt für mich aber eher nach der Execute-Methode.

R
Robin0 Themenstarter:in
212 Beiträge seit 2012
vor 9 Jahren

Wenn ich den Button auß der ListBox rausschiebe funltioniert alles supi.

Die DynamicResources funltionieren auch alle. Es geht konkret um den Command. Ich komme einfach nicht auf den DataContext des UserControls.

Der CommandParameter ist ein String, sollte also keine probleme verursachen.

Der Command heißt wirklich Command_Action und ist ein ICommand wobei es auchnicht funktioniert wenn ich die CommandKlasse als Typ für den Command verwende.(Komme ja nichteinmal zum UserControl)

R
Robin0 Themenstarter:in
212 Beiträge seit 2012
vor 9 Jahren

Wenn ich keine ListBox sondern eine ListView verwende funktionierts 😃.

Danke für eure hilfe.

P
157 Beiträge seit 2014
vor 9 Jahren

Noch ein kleiner Tip für dein Binding:
Anstatt

{Binding Path=DataContext.Command_Action, RelativeSource={RelativeSource AncestorLevel=1, Mode=FindAncestor, AncestorType={x:Type UserControl}}}" 

kannst du einfach

{Binding Path=DataContext.Command_Action, ElementName=myUserControl} 

verwenden.
Deinem UserControl gibst du den Namen

x:Name=myUserControl.

RelativeSource-Bindings sind sehr langsam und es sieht auch viel eleganter aus.

vg

Wenn's zum weinen nicht reicht, lach drüber!