29

我显示了多个视频,它们与 Mainviewmodel 中的视频集合绑定。一切正常,直到我尝试将输入命令绑定到 Mainviewmodel。我不知道这个的语法。就目前而言,绑定设置为 Video 而不是 Mainviewmodel。

错误信息:

'StartVideoCommand' property not found on 'object' ''Video'   

xml:

<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
4

2 回答 2

41
Command="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}, Path=DataContext.StartVideo}"
于 2013-08-23T00:02:28.810 回答
5

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

例子:

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

  ...

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

  ...

一个可能的优势RelativeSource是这是明确的;如果有人更改 XAML 层次结构,则相对引用可能会意外中断。(在这个绑定到 a 的特定示例中不太可能Window)。

此外,如果您的“根”元素已经被命名,那么它就更容易利用了。

它也更具可读性。

于 2020-05-01T19:45:21.730 回答