WPF - 可以将命令绑定到 DataGrid 中的“SelectedItem”,但不能调用它

本文关键字:SelectedItem 但不能 调用 中的 DataGrid 命令 绑定 WPF | 更新日期: 2023-09-27 18:28:54

我的观点有两个DataGrid。第一个是在调用 ViewModel 构造函数时填充的。当用户单击第一个 DataGrid 中的行时,将填充第二个。我认为问题是当我运行绑定到第一个数据网格(RowAClickCommand(的操作时,我为第二个数据网格(RowBClickCommand(设置了操作。

再说一次,我看不出当我单击第二个 DataGrid 中的项目时没有调用它的任何原因。

我的方法有什么问题?

下面是 .xaml 文件:

<Grid Grid.Row="0">
    <DataGrid
    x:Name="ADataGrid"
    SelectedItem="{Binding CurrSelectedA, Mode=TwoWay}"
    ItemsSource="{Binding AData}">
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="MouseLeftButtonUp" >
                <i:InvokeCommandAction
                Command="{Binding RowAClickCommand}"/>
            </i:EventTrigger>
        </i:Interaction.Triggers>
    </DataGrid>
</Grid>
<Grid Grid.Row="1">
    <DataGrid
    x:Name="BDataGrid"
    SelectedItem="{Binding CurrSelectedB, Mode=TwoWay}"
    ItemsSource="{Binding BData}">
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="MouseLeftButtonUp" >
                <i:InvokeCommandAction
                Command="{Binding RowBClickCommand}"/>
            </i:EventTrigger>
        </i:Interaction.Triggers>
    </DataGrid>
</Grid>

视图模型定义如下:

public class MainWindowViewModel : INotifyPropertyChanged
{
    public ICommand RowAClickCommand { get { return _rowAClickCommand; } }
    public ICommand RowBClickCommand { get { return _rowBClickCommand; } }
    // ...
    public MainWindowViewModel()
    {
        _rowAClickCommand = new MainWindow.DelegateCommand(() =>
        {
            _rowBClickCommand = new MainWindow.DelegateCommand(() =>
            {
                MessageBox.Show("x");
            });
            var complexTypeB = new ComplexTypeB();
            _Bdata = new ObservableCollection<B>(complexTypeB.l);
            OnPropertyChanged("BData");
            BView = CollectionViewSource.GetDefaultView(_Bdata);
            BView = CollectionViewSource.GetDefaultView(_Bdata);
            BView.CurrentChanged += delegate
            {
                _currSelectedB = (B)BView.CurrentItem;
            };
        });
        var someComplexTypeInstance = new ComplexTypeA();
        _Adata = new ObservableCollection<A>(someComplexTypeInstance.l);
        AView = CollectionViewSource.GetDefaultView(_Adata);
        AView.CurrentChanged += delegate
        {
            _currSelectedA = (A)AView.CurrentItem;
        };
    }
}

WPF - 可以将命令绑定到 DataGrid 中的“SelectedItem”,但不能调用它

您需要

_rowBClickCommand设置为其他内容后调用OnPropertyChanged("RowBClickCommand")。 像这样:

_rowAClickCommand = new DelegateCommand(() =>
{
    MessageBox.Show("ACalled");
    _rowBClickCommand = new DelegateCommand(() =>
    {
        MessageBox.Show("BCalled");
    });
    OnPropertyChanged("RowBClickCommand");   
});

我认为您必须更改命令的绑定,如下所示:

<i:InvokeCommandAction
    Command="{Binding RowAClickCommand, 
                      RelativeSource={RelativeSource Mode=FindAncestor
                                                     AncestorType={x:Type Window}}}"/>

同样地:

<i:InvokeCommandAction
    Command="{Binding RowBClickCommand, 
                      RelativeSource={RelativeSource Mode=FindAncestor
                                                     AncestorType={x:Type Window}}}"/>