Binding to viewmodel from inside a datatemplate

15,963

Solution 1

Command="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}, Path=DataContext.StartVideo}"

Solution 2

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.

Share:
15,963
Jeroen
Author by

Jeroen

Updated on July 22, 2022

Comments

  • Jeroen
    Jeroen almost 2 years

    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