从其他视图将 CommandParameters 绑定到 属性
Binding CommandParameters to Property from other View
我有一个带有工具栏和 TabContent 区域 (PRISM) 的视图(主视图)。
在 TabContent 区域中,我有两个选项卡(两个视图 - 视图 A,视图 B-)以不同的方式表示相同的模型(联系人)。
视图 A 包含一个带有联系人的 DataGrid。主视图中的工具栏包含带有 DeleteCommand 的 "Delete Button"。我想使用 DeleteCommand 发送视图 A 中的选定联系人作为命令参数,但使用下面显示的代码,命令参数为空。主视图似乎没有从位于视图 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>
这是视图 A:
<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>
上面的 EventTrigger 将 DataGrid 中的 SelectedItems 与 ViewModel 同步。
ViewModel 添加:
// 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; }
在你的 ctor 中,或者你绑定命令的任何其他地方,添加:
SelectedItemsCommand = new DelegateCommand<object>(SelectContacts);
DelegateCommand 调用的 SelectContacts 方法:
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);
}
}
}
您现在在 ViewModel 中有一个私有 _selectedContacts
集合,其中包含在视图中选择的所有项目,并且会在 SelectionChanged
事件从视图中的 DataGrid 触发时更新。
做你需要做的。祝你好运!
我有一个带有工具栏和 TabContent 区域 (PRISM) 的视图(主视图)。 在 TabContent 区域中,我有两个选项卡(两个视图 - 视图 A,视图 B-)以不同的方式表示相同的模型(联系人)。
视图 A 包含一个带有联系人的 DataGrid。主视图中的工具栏包含带有 DeleteCommand 的 "Delete Button"。我想使用 DeleteCommand 发送视图 A 中的选定联系人作为命令参数,但使用下面显示的代码,命令参数为空。主视图似乎没有从位于视图 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>
这是视图 A:
<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>
上面的 EventTrigger 将 DataGrid 中的 SelectedItems 与 ViewModel 同步。
ViewModel 添加:
// 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; }
在你的 ctor 中,或者你绑定命令的任何其他地方,添加:
SelectedItemsCommand = new DelegateCommand<object>(SelectContacts);
DelegateCommand 调用的 SelectContacts 方法:
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);
}
}
}
您现在在 ViewModel 中有一个私有 _selectedContacts
集合,其中包含在视图中选择的所有项目,并且会在 SelectionChanged
事件从视图中的 DataGrid 触发时更新。
做你需要做的。祝你好运!