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>
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
Microsoft MVP // Me // Blog // GitHub // @Egghead // All my talks // Speakerdeck
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.
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)
Wenn ich keine ListBox sondern eine ListView verwende funktionierts 😃.
Danke für eure hilfe.
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!