Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Binding to viewmodel from inside a datatemplate

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 
like image 212
Jeroen Avatar asked Aug 15 '13 03:08

Jeroen


People also ask

How do I bind a ViewModel in XAML?

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.


2 Answers

Command="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}, Path=DataContext.StartVideo}" 
like image 182
Jeroen Avatar answered Sep 30 '22 19:09

Jeroen


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.

like image 41
StayOnTarget Avatar answered Sep 30 '22 19:09

StayOnTarget