Hallo,
ich verwende MVVMLight und möchte eine Art Gallerie erstellen. Ein Scrollviewer in dem die Bilder dargestellt werden.
Die Bilder werden in Form eines Buttons dargestellt. Wenn auf ein Bild geklickt wird, soll Code ausgeführt werden. Nur funktioniert das ganze nicht innerhalb des Scrollviewers. Der "HomeCommand" wird nicht ausgelöst.
Kann mir jemand hier weiterhelfen?
Danke
XAML
<ScrollViewer Style="{StaticResource ScrollViewerStyle}" x:Name="ScrollViewer" Grid.Row="1">
<ItemsControl x:Name="itemsControl" ItemsSource="{Binding Images}" >
<ItemsControl.ItemTemplate>
<DataTemplate>
<Button Command="{Binding HomeCommand}">
<Image Source="{Binding ImageUri}" Height="{Binding ActualHeight, ElementName=ScrollViewer, Mode=OneWay}" />
</Button>
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</ScrollViewer>
ViewModel
private RelayCommand _homeCommand;
public RelayCommand HomeCommand
{
get
{
return _homeCommand
?? (_homeCommand = new RelayCommand(
() =>
{
_navigationService.NavigateTo("Home");
}));
}
}
Das hat mit dem ScrollViewer nichts zu tun sondern mit dem ItemsControl. Der sucht den HomeCommand in den Elementen der Menge die an das ItemsControl gebunden sind. Such mal nach RelativeSource beim Binding.
Ein Beispiel dafür gibt es in [Artikel] MVVM und DataBinding im Abschnitt "Commands".
Das Debuggen von Bindings ist dort auch im Abschnitt "Debugging" beschrieben.
Weeks of programming can save you hours of planning
<Button Command="{Binding DataContext.HomeCommand, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}">
<Image Source="{Binding ImageUri}" Height="{Binding ActualHeight, ElementName=ScrollViewer, Mode=OneWay}" />
</Button>
Ich habs jetzt mal so probiert aber es löst einfach nicht aus..
Gibt es eine Fehlermeldung im Ausgabefenster?
Weeks of programming can save you hours of planning
Naja, vllt hast du nur den ersten von mehreren Fehlern gelöst. Wird denn der Code im RelayCommand ausgeführt? Hast du da mal ein Breakpoint gesetzt? Was passiert wenn du den Command von woanders her aufrufst?
Wenn ich den Command außerhalb des Scrollviewers über einen normalen Button aufrufe geht es ohne Probleme.
Mir fällt aber gerade auf, wenn die View geladen wird, dann springt er für jeden Button im ItemControl in den Command aber den darin enthaltenen Code führt er nicht aus..
Und beim klicken auf die Buttons im ItemControl passiert weiterhin nichts.
FindAncestor-Type fehlt, Beispiel:
Command="{Binding DataContext.OpenCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}"