Avalonia TreeView绑定ViewModel命令失败求助
解决Avalonia TreeView绑定MainWindowViewModel中RelayCommand的问题
问题根源
TreeView的每个节点默认DataContext是你的Node模型实例,而NodePressedCommand定义在MainWindowViewModel中,直接绑定会在Node模型里查找命令导致报错;之前的RelativeSource绑定写法错误,导致无法定位到Window的DataContext。
正确绑定方案
根据触发场景分两种情况:
1. TreeView选中节点时触发命令(绑定SelectedItemChanged事件)
需要借助EventToCommand行为(需引用Avalonia.Xaml.Interactions包),TreeView自身的DataContext继承自Window,可直接绑定ViewModel中的命令:
<!-- 先引入命名空间 --> xmlns:i="clr-namespace:Avalonia.Xaml.Interactivity;assembly=Avalonia.Xaml.Interactivity" xmlns:ia="clr-namespace:Avalonia.Xaml.Interactions.Core;assembly=Avalonia.Xaml.Interactions" <TreeView ItemsSource="{Binding Nodes}"> <i:Interaction.Behaviors> <ia:EventToCommand EventName="SelectedItemChanged" Command="{Binding NodePressedCommand}" CommandParameter="{Binding SelectedItem, RelativeSource={RelativeSource Self}}"/> </i:Interaction.Behaviors> <TreeView.ItemTemplate> <DataTemplate> <TextBlock Text="{Binding Name}"/> </DataTemplate> </TreeView.ItemTemplate> </TreeView>
2. 点击节点内控件时触发命令
在ItemTemplate的控件中,通过RelativeSource定位到Window的DataContext,再绑定命令:
<TreeView.ItemTemplate> <DataTemplate> <TextBlock Text="{Binding Name}"> <i:Interaction.Behaviors> <ia:EventToCommand EventName="PointerPressed" Command="{Binding DataContext.NodePressedCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}" CommandParameter="{Binding}"/> </i:Interaction.Behaviors> </TextBlock> </DataTemplate> </TreeView.ItemTemplate>
前置检查
- 确保MainWindow的DataContext已设置为
MainWindowViewModel实例:// MainWindow.xaml.cs构造函数 public MainWindow() { InitializeComponent(); DataContext = new MainWindowViewModel(); } - 确保ViewModel继承自
ObservableObject或ViewModelBase(Community MVVM要求):public class MainWindowViewModel : ObservableObject { [RelayCommand] public void NodePressed() { Debug.WriteLine("Clicked"); } }
内容的提问来源于stack exchange,提问作者MikeAinOz
相关产品推荐
相关产品推荐

