Wpf 从其他视图将CommandParameters绑定到属性

Wpf 从其他视图将CommandParameters绑定到属性,wpf,datagrid,command,prism,commandparameter,Wpf,Datagrid,Command,Prism,Commandparameter,我有一个带有工具栏和TabContent区域(PRISM)的视图(主视图)。 在TabContent区域中,我有两个选项卡(两个视图-视图A、视图B-),以不同的方式表示相同的模型(联系人) 视图A包含带有联系人的数据网格。主视图中的工具栏包含一个带有Delete命令的“删除按钮”。我想用DeleteCommand将视图A中选定的联系人作为命令参数发送,但使用下面显示的代码,命令参数为null。主视图似乎没有从视图A中的DataGrid中检索所选项目。我如何才能做到这一点 这是主要观点: <

我有一个带有工具栏和TabContent区域(PRISM)的视图(主视图)。 在TabContent区域中,我有两个选项卡(两个视图-视图A、视图B-),以不同的方式表示相同的模型(联系人)

视图A包含带有联系人的数据网格。主视图中的工具栏包含一个带有Delete命令的“删除按钮”。我想用DeleteCommand将视图A中选定的联系人作为命令参数发送,但使用下面显示的代码,命令参数为null。主视图似乎没有从视图A中的DataGrid中检索所选项目。我如何才能做到这一点

这是主要观点:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="30" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>

    <DockPanel Grid.Row="0" Background="#D6D6DC">
        <ToolBar Style="{StaticResource ModuleToolBarStyle}">
            <TextBlock Margin="10,0,0,0" Text="Contacts"></TextBlock>
            <Button Name="addContactButton" ToolTip="Add Contact">
                <Image Source="/PrismApp.Controls;component/Images/add.png"/>
            </Button>
            <Button Name="deleteContactsButton" ToolTip="Delete selected Contacts"
                    Command="{Binding DeleteContactCommand}" CommandParameter="{Binding SelectedItems, ElementName=ContactsList}">
                <Image Source="/PrismApp.Controls;component/Images/delete.png"/>
            </Button>
            <ToggleButton Name="ViewAButton" ToolTip="View A" Command="{Binding NavigateToViewACommand}"
                          IsChecked="{Binding IsViewAActive}">
                <Image Source="/PrismApp.Controls;component/Images/listblack.png"/>
            </ToggleButton>
            <ToggleButton Name="ViewBButton" ToolTip="View B" Command="{Binding NavigateToViewBCommand}"
                          IsChecked="{Binding IsViewBActive}">
                <Image Source="/PrismApp.Controls;component/Images/tilesblack.png"/>
            </ToggleButton>
        </ToolBar>
    </DockPanel>

    <TabControl Grid.Row="1" prism:RegionManager.RegionName="ContactsViewRegion">
        <TabControl.ItemContainerStyle>
            <Style TargetType="{x:Type TabItem}">
                <Setter Property="Visibility" Value="Collapsed"/>
            </Style>
        </TabControl.ItemContainerStyle>
    </TabControl>
</Grid>

这是一个观点:

<Grid>
    <DataGrid x:Name="ContactsList" Margin="20" AutoGenerateColumns="False" IsReadOnly="True" CanUserResizeRows="False"
              CanUserResizeColumns="True" ColumnWidth="*" ItemsSource="{Binding Contacts}">

    </DataGrid>
</Grid>


主视图、视图A和视图B的视图模型是相同的。

要完成我认为您需要的工作,首先需要在DataGrid所在的视图中使用以下名称空间

xmlns:i=”http://schemas.microsoft.com/expression/2010/interactivity“

这类似于您想要添加到DataGrid的内容;具体来说,
i:Interaction.Triggers
部分:

<DataGrid x:Name="ContactsDataGrid" ItemsSource="{Binding Contacts}" Margin="20" CanUserAddRows="False"
                VerticalAlignment="Top" IsReadOnly="True" AutoGenerateColumns="False" 
                SelectionMode="Extended" SelectionUnit="FullRow">
    <DataGrid.Columns>
        ...
    </DataGrid.Columns>
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="SelectionChanged">
            <i:InvokeCommandAction Command="{Binding SelectedItemsCommand}" 
                                    CommandParameter="{Binding Path=SelectedItems,ElementName=ContactsDataGrid}"/>
        </i:EventTrigger>
    </i:Interaction.Triggers>
</DataGrid>
现在,ViewModel中有一个私有的
\u selectedContacts
集合,其中包含视图中选定的所有项目,当视图中的DataGrid触发
SelectionChanged
事件时,该集合将更新


你需要怎么做就怎么做。祝你好运

ViewModel是如何制作的?每个视图都有一个ViewModel,还是所有视图都有一个ViewModel?@NawedNabiZada所有视图都有一个ViewModel(主视图、视图a和视图B),这样您就可以更轻松地将所选项目绑定到虚拟机中的某个属性,并通过命令访问该属性property@NawedNabiZada是的,但我不想只检索一个选定项目,但所有人都选择了编辑。SelectedItems是只读属性,因此不能通过标记进行设置。谢谢!这正是我需要的。
// A list to store the selected contacts in
private List<Contact> _selectedContacts = new List<Contact>();

// A DelegateCommand that will be invokes when selections change in the DataGrid
public DelegateCommand<object> SelectedItemsCommand { get; set; }
private void SelectContacts(object contacts)
{
    var selected_contacts = contacts as System.Collections.IList;
    if (selected_contacts != null)
    {
        _selectedContacts.Clear();
        foreach (var contact in selected_contacts)
        {
            _selectedContacts.Add((Contact)contact);
        }
    }
}