2016-12-31 3 views
0

ツールバーとTabContent領域(PRISM)を持つビュー(メインビュー)があります。 TabContent領域には、同じモデル(連絡先)を別の方法で表す2つのタブ(2つのビュー-View A、View B-)があります。他のビューからのプロパティへのCommandParametersのバインド

View Aには連絡先を含むDataGridが含まれています。メインビューのツールバーには、DeleteCommandを含む「Delete Button」が含まれています。私は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> 

これは、ビュー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を作成しましたか?ビューごとにViewModelがあるのか​​、それともすべてのViewModelが1つだけですか? –

+0

@NawedNabiZadaすべてのビュー(メインビュー、ビューA、およびビューB)の1つだけ – chincheta73

+0

あなたの人生を楽にし、選択したアイテムをVM内のプロパティにバインドすると、そのプロパティにアクセスできます。 –

答えて

0

に同じです私が必要と思うことは、DataGridが存在する場所で最初に必要なのは次の名前空間です。

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

これは、あなたがデータグリッドに追加したくなるでしょう何のようなものです。具体的には、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は、上記のViewModelでのDataGridでselectedItemsのを同期しますものです。

のViewModel追加:あなたのctorで

// 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);

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のコレクション。ビューのDataGridからSelectionChangedイベントが発生すると更新されます。

あなたが必要とすることをしてください。運が良かった!

+0

ありがとう!これはまさに私が必要としていたものです。 – chincheta73

関連する問題