无法在ListBox中绑定命令

时间:2013-12-11 15:37:32

标签: c# wpf mvvm

我的WPF使用MVVM方法。我正在尝试在列表控件中绑定2个控件

<ListBox ItemsSource="{Binding ParentDuplicate}" SelectedItem="{Binding SelectedParent, UpdateSourceTrigger=PropertyChanged}">
    <ListBox.ItemTemplate>
         <DataTemplate>
             <StackPanel>
                    <ContentControl Content="{Binding}" />
                    <Button Content="Delete me now" 
                            Command="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorLevel=1, AncestorType=Window}, Path=DeleteCommand}" 
                            CommandParameter="{Binding FilePath}" />
              </StackPanel>
           </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

我遇到的问题是,DeleteCommand没有绑定(输出窗口也告诉我)

  

System.Windows.Data错误:4:无法找到绑定源,引用'RelativeSource FindAncestor,AncestorType ='System.Windows.Data.Binding',AncestorLevel ='1''。 BindingExpression:路径=的DeleteCommand;的DataItem = NULL; target元素是'Button'(Name =''); target属性是'Command'(类型'ICommand')

如果我将此按钮移动到ListBox外部,那么绑定工作并且事件触发,所以我知道问题必须与ListBox有关(我猜测问题是ItemsSource阻止绑定到除了ItemsSource绑定之外的任何东西属性(在本例中为ParentDuplicate))

因此,在Button控件中,有2个属性被绑定,DeleteCommandFilePath

这两个属性都存在于我的单个ViewModel中。 FilePath是ParentDuplicate的子代,它根据需要绑定。问题仅出在DeleteCommand上。我做错了什么?

修改

当我使用Command="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorLevel=1, AncestorType=Window}, Path=DeleteCommand}时,它会查看我的MainWindow代码,而不是ViewModel。如何使用ViewModel?

我试过

Command="{Binding RelativeSource={RelativeSource  AncestorType=xmlnsViewModel:MainWindowViewModel}, Path=DeleteCommand}" 

但上述内容也导致相同的绑定错误

1 个答案:

答案 0 :(得分:3)

祖先搜索找到控件而不是DataContext,因此您需要告诉绑定在哪里找到DeleteCommand属性。如果您的ViewModel是MainWindow的DataContext,那么您可以使用:

<Button Content="Delete me now" 
    Command="{Binding RelativeSource={RelativeSource 
                  Mode=FindAncestor, AncestorLevel=1, AncestorType=Window}, 
                  Path=DataContext.DeleteCommand}" 
    CommandParameter="{Binding FilePath}" />