从ItemsControl.ItemTemplate中绑定到视图模型属性

5

我有一个对象集合和ViewModel中的一个命令。

我想为集合中的每个对象显示一个超链接,并将每个超链接的命令设置为相同的命令,将对象ID作为CommandParameter传递给该命令。例如:

// View Model
public class MyViewModel : ViewModelBase
{
  // Raises PropertyChanged event, ommited here
  public List<MyClass> MyList {....}

  public RelayCommand<int> MyCommand {....}
}

我将UserControl的DataContext设置为上述ViewModel类。此UserControl的XAML如下:

<UserControl>
  <ItemsControl ItemsSource="{Binding Path=MyList}">
    <ItemsControl.ItemsPanel>
      <ItemsPanelTemplate>
        <StackPanel />
      </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>

    <ItemsControl.ItemTemplate>
      <DataTemplate>
        <HyperlinkButton Content="{Binding Path=Description}" Command="{Binding Path=MyCommand}" CommandParameter="{Binding Path=MyClassID}"/>
      </DataTemplate>
    </ItemsControl.ItemTemplate>
  </ItemsControl>
</UserControl>

超链接内容的描述显示正确,但命令从未触发,我猜测这是因为它正在寻找MyClass对象内的命令?如何绑定到UserControl的DataContext.MyCommand而不是它正在寻找的MyClass.MyCommand?
1个回答

6

很遗憾,我们在WPF中没有RelativeSource标记扩展中的FindAncestor模式,因此您无法使用它(这将在Silverlight 5中添加)。虽然有点麻烦,但您可以给UserControl元素命名,并使用ElementName绑定到分配给其DataContext的对象上的命令。

例如:

<UserControl Name="root">

然后将命令绑定到UserControl的DataContext上(使用点表示法):
Command="{Binding Path=DataContext.MyCommand, ElementName=root}"

试着尝试一下。


Chris,我和Fermin有同样的问题。我正在使用SL 5,RelativeSource绑定不起作用,你的答案也不行。顺便说一下,我不明白你的答案怎么可能有效,因为DataContext没有一个叫做MyCommand的属性。在我的视图中,即根部,我有一个叫做ViewModel的属性,在getter中我这样做:return(MyViewModel)DataContext。它仍然不起作用。 - Sam
嗨,Sam,MyCommand与Fermin提供的示例相关 - 它是他视图模型上的一个命令。不幸的是,我没有足够的细节来帮助您解决问题。最好您重新提出一个新问题,并详细说明您要做什么以及如何做。 - Chris Anderson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接