Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
WPF: Binding mit RelativeSource - FindAncestor
Robin0
myCSharp.de - Member



Dabei seit:
Beiträge: 213

Themenstarter:

WPF: Binding mit RelativeSource - FindAncestor

beantworten | zitieren | melden

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>
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Robin0 am .
private Nachricht | Beiträge des Benutzers
Coffeebean
myCSharp.de - Team

Avatar #avatar-3295.gif


Dabei seit:
Beiträge: 2459
Herkunft: Deutschland/Schweiz

beantworten | zitieren | melden

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.
Zitat
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
private Nachricht | Beiträge des Benutzers
t0ms3n
myCSharp.de - Member



Dabei seit:
Beiträge: 319

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Robin0
myCSharp.de - Member



Dabei seit:
Beiträge: 213

Themenstarter:

beantworten | zitieren | melden

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)
private Nachricht | Beiträge des Benutzers
Robin0
myCSharp.de - Member



Dabei seit:
Beiträge: 213

Themenstarter:

beantworten | zitieren | melden

Wenn ich keine ListBox sondern eine ListView verwende funktionierts :).

Danke für eure hilfe.
private Nachricht | Beiträge des Benutzers
Parso
myCSharp.de - Member



Dabei seit:
Beiträge: 160

beantworten | zitieren | melden

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!
private Nachricht | Beiträge des Benutzers