2016-12-31 32 views
0

我有一個帶有工具欄和TabContent區域(PRISM)的視圖(主視圖)。 在TabContent區域我有兩個選項卡(兩個視圖 - 視圖A,視圖B-)以不同的方式表示相同的模型(聯繫人)。將CommandParameters綁定到其他視圖的屬性

視圖A包含帶聯繫人的DataGrid。主視圖中的工具欄包含一個帶有DeleteCommand的「刪除按鈕」。我想使用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.查看

+0

以及ViewModel是如何製作的?每個View有沒有ViewModel,或者只有一個ViewModel? –

+0

@NawedNabiZada只是一個爲所有視圖(主視圖,視圖A和視圖B) – chincheta73

+0

然後,你可以讓你的生活更輕鬆,你所選的項目綁定到一個屬性在你的虛擬機,並在你的命令,你可以訪問該屬性 –

回答

0

爲了同一做我認爲你需要的東西,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是什麼將同步的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; } 

在你的構造函數,或其他任何地方你綁定命令,補充一點:

SelectedItemsCommand = new DelegateCommand<object>(SelectContacts);

SelectContacts方法,該DelegateCommand電話:

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中的集合,並且將在從視圖中的DataGrid觸發SelectionChanged事件時進行更新。

這樣做,你需要。祝你好運!

+0

謝謝!這正是我需要的。 – chincheta73

相關問題