从datatemplate内部绑定到viewmodel

时间:2013-08-15 03:32:52

标签: wpf binding viewmodel datatemplate itemtemplate

我有多个视频显示它们与Mainviewmodel中的视频选择绑定。一切正常,直到我尝试将enter命令绑定到Mainviewmodel。我不知道这个的语法。目前,绑定设置为Video而不是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

2 个答案:

答案 0 :(得分:29)

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

答案 1 :(得分:2)

另一种方法是使用ElementName绑定而不是RelativeSource

示例:

<Window x:Name="root" ... >

  ...

  Command="{Binding ElementName=root, Path=DataContext.StartVideo}"

  ...

RelativeSource相比,可能的优点是这很明显。如果有人更改了XAML层次结构,则相对引用可能会无意间中断。 (但是,在这个绑定到Window的特定示例中不太可能。)

如果您的“根”元素已经被命名,那么就越容易使用。

它也更具可读性。