2017-02-03 18 views
1

у меня есть это ListView:UWP: Как поймать щелчок части списка из другого списка в viewmodel вместо кода?

<Page 
    x:Class="DataBase.ControlsPage" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    DataContext="{Binding CustomersViewModel, Source={StaticResource ViewModelLocator}}"> 

    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> 
     <ListView Name="HeaderList" ItemsSource="{Binding Customers}"> 
      <ListView.ItemTemplate> 
       <DataTemplate> 
        <Grid> 
         <Border Background="Bisque"> 
          <TextBlock Text="{Binding Name"/> 
         </Border> 
         <ListView Name="SubItemsList" ItemsSource="{Binding Project}" ItemClick="SubItemClick"> 
         <x:String>SubItem 1</x:String> 
         <x:String>SubItem 2</x:String> 
         <x:String>SubItem 3</x:String> 
         </ListView> 
        </Grid> 
       </DataTemplate> 
      </ListView.ItemTemplate> 
     <x:String>Item 1</x:String> 
     <x:String>Item 2</x:String> 
     <x:String>Item 3</x:String> 
     </ListView> 
    </Grid> 
</Page> 

Все, что я хочу, чтобы поймать щелчок подэлемент (ItemClick = "SubItemClick">) в моем CustomersViewModel. Это возможно? Я знаю, что для элементов списка подпозиций данные представляют собой проект, который является только моделью данных, он не содержит обработчика кликов. Но как я могу поймать щелчок в модели представления, а не в коде?

Кроме того, я загрузив картинку, чтобы визуализировать то, что я хочу:

enter image description here

ответ

0

Как сказал Джастин XL, ответ, который я искал это: ItemClick="{Binding DataContext.ClickCommand, ElementName=HeaderList}"

3

Что вам действительно нужно в вашем ViewModel ClickCommand. Но так как управление ListView не выдает ItemClickCommand, один из распространенных способов - использовать поведение, чтобы установить соединение между вашим ClickCommand и событием ItemClick.

Это конкретное поведение, которое вы ищите, называется InvokeCommandAction, которое можно найти в этом nuget package.

В основном конечный результат будет выглядеть примерно так -

<ListView Name="HeaderList" ItemsSource="{Binding Customers}"> 
    <Interactivity:Interaction.Behaviors> 
     <Interactions:EventTriggerBehavior EventName="ItemClick" SourceObject="{Binding ElementName=HeaderList}"> 
      <Interactions:InvokeCommandAction Command="{Binding ClickCommand}"/> 
     <Interactions:EventTriggerBehavior> 
    <Interactivity:Interaction.Behaviors> 
+0

То, что я хочу сказать, что мне нужно " ClickCommand ", чтобы существовать в CustomerViewModel и для второго ListView, ItemSource привязан к проекту не для CustomerViewModel. Поэтому мне нужно как-то отправить событие click обратно в CustomerViewModel. – mbob

+0

@mbOB как насчет использования шаблона мессенджера MvvmLightas для совместного доступа к клику? Связаны ли ваши две модели просмотра с разными страницами? –

+0

Клиенты - это свойство CustomerViewModel, которое связано с основным списком (пункт 1, пункт 2 и т. Д.). Каждый Клиент будет содержать список проектов, которые будут ItemSource для второго списка (SubItem 1, Subitem 2 и т. Д.). Таким образом, «Проект» больше не является моделью просмотра, это всего лишь модель данных. – mbob