我现在正在摆弄 Avalonia UI,并且在列表框中实现编辑按钮时遇到问题。
该按钮仅在选择该项目时才可见,并且应执行在 ViewModel 中定义的名为 EditCommand 的 ICommand。可见性绑定工作得很好,但命令绑定却不行,我似乎不明白为什么。
<ListBox Name="ListBoxDisplay" ItemsSource="{Binding ObservableCollection}" SelectedItem="{Binding SelectedItem}">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid ColumnDefinitions="2*, *, *">
[snipped listbox content that's not relevant]
<Button Grid.Column="2" IsVisible="{Binding RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}}, Path=IsSelected}"
Command="{Binding ElementName=ListBoxDisplay, Path=DataContext.EditCommand}">
Edit
</Button>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
已经尝试使用RelativeSource(到ListBox或整个UserControl)将其绑定,并将其直接绑定到EditCommand。
错误总是相同的:
Unable to resolve property or method of name 'EditCommand' on type 'System.Object'.
如有任何帮助,我们将不胜感激!
因此,在这些情况下,我用来绑定到祖先的 viewmodel 属性的方式如下:
Command="{Binding $parent[ListBox].DataContext.EditCommand}"
但是上次我尝试 Avalonia 11 时也遇到了类似的问题,我在他们的文档中找到了答案 - 我必须添加显式转换
Command="{Binding $parent[ListBox].((vm:ParentViewModel)DataContext).EditCommand}
另外,如果您的按钮不在另一个数据模板内,您可以直接绑定到属性
IsVisible="{Binding IsSelected}"