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;
};
}
}
您需要
在_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}}}"/>