我的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个属性被绑定,DeleteCommand
和FilePath
这两个属性都存在于我的单个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}"
但上述内容也导致相同的绑定错误
答案 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}" />