I have multiple videos displayed they are bound with a videocollection in Mainviewmodel. Everything works fine untill I try to bind the enter command to Mainviewmodel. I Don't know the syntax for this. As it stands the binding is set to Video and not Mainviewmodel.
Errormessage:
'StartVideoCommand' property not found on 'object' ''Video'
Xaml:
<Window.Resources> <local:MainViewModel x:Key="MainViewModel"/> </Window.Resources> <Grid DataContext="{StaticResource MainViewModel}"> <ListBox ItemsSource="{Binding Videos}"> <ListBox.ItemTemplate> <DataTemplate> <Grid> <Grid.InputBindings> !!! <KeyBinding Key="Enter" Command="{Binding StartVideo}" /> !Bound to Video not to Mainviewmodel grrr </Grid.InputBindings> ... layout stuff <TextBlock Text="{Binding Title}" Grid.Column="0" Grid.Row="0" Foreground="White"/> <TextBlock Text="{Binding Date}" Grid.Column="0" Grid.Row="1" Foreground="White" HorizontalAlignment="Left"/> <TextBlock Text="{Binding Length}" Grid.Column="1" Grid.Row="1" Foreground="White" HorizontalAlignment="Right"/> ... closing tags
There are 3 ways to bind the View with ViewModel. One way is to bind DataContext Property within a XAML, Second is to assign DataContext within Code-Behind and last using ViewModelLocator.
Command="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}, Path=DataContext.StartVideo}"
Another approach would be to use ElementName
binding instead of RelativeSource
.
Example:
<Window x:Name="root" ... > ... Command="{Binding ElementName=root, Path=DataContext.StartVideo}" ...
A possible advantage over RelativeSource
is that this is explicit; if someone changes the XAML hierarchy then relative references could break unintentionally. (Not likely in this specific example of binding to a Window
however).
Also if your "root" element already is named then so much the better it is easy to take advantage of.
It is also somewhat more readable.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With