首页 文章

无法在ListBox中绑定命令

提问于
浏览
0

我的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上 . 我究竟做错了什么?

Edit

当我使用 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 回答

  • 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}" />
    

相关问题