Как определить Pivot View, используя MVVM в WP7? - PullRequest
7 голосов
/ 17 мая 2011

В основном у меня есть элемент управления Pivot в моем приложении WP7, которое содержит 3 представления.При каждом просмотре я вызываю 1 из 3 моих разных веб-сервисов.То, что я пытаюсь сделать, это вызывать службу только тогда, когда они переходят к этому конкретному представлению.

Это довольно просто, используя код позади, потому что все, что вы делаете, это используете выбранный индекс с оператором switch, и вы можете запускать определенные методы соответственно.Любая идея о том, как сделать это из модели представления?

ПРИМЕЧАНИЕ: Я использую MVVM Light.

ОБНОВЛЕНИЕ: Вот мой кодчто я обычно использовал бы:

private void PivotItem_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        int currentPivot = ResultsPivot.SelectedIndex;
        switch (currentPivot)
        {
            case 0:
                //Fire Method 1
                break;
            case 1:
                //Fire Method 2
                break;
            case 2:
                //Fire Method 3
                break;
            default:
                //Fire default method
                break;
        }
    }

Ответы [ 5 ]

5 голосов
/ 17 мая 2011

Стандартный подход с MVVMLight - это разделение вашей модели представления на данные и команды. Большинство вещей, которые вы используете, связаны с данными, свойствами и т. Д., Но команды действительно что-то делают.

В этом случае то, что вы называете «Метод огня 1», является обычным методом, который для соответствия шаблону вы должны преобразовать в команду. Если у вас уже есть команды, вы знаете, о чем я говорю.

Клей для таких событий, как SelectionChanged, который вы бы связали с code-behind в MVVMLight, - это EventToCommand, который представляет собой фрагмент XAML, который вы вставляете в XAML с элементом pivot, а не в обработчик событий. 1007 *

Итак, это шаблон: EventToCommand - ваш ключ к подключению событий XAML к командам модели представления без какого-либо кода позади. Лучше всего использовать образцы MVVMLight, чтобы увидеть, как работает EventToCommand, потому что есть много способов его использовать.

Но вот голая версия:

<controls:PivotItem Name="pivotItem">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="SelectionChanged">
            <cmd:EventToCommand Command="{Binding SelectServiceCommand}"
                                CommandParameter="{Binding SelectedIndex, ElementName=pivotItem}"/>
        </i:EventTrigger>
        <!-- other stuff  -->
    </i:Interaction.Triggers>
</controls:PivotItem>

и для этой работы SelectServiceCommand должен фактически существовать в модели представления, он должен принимать параметр и делать правильные вещи для 0, 1, 2, 3 и т. Д.

4 голосов
/ 23 января 2012

Это может быть решено следующим образом

<controls:Pivot x:Name="PivotControl"  FontSize="18"  >
        <Custom:Interaction.Triggers>
            <Custom:EventTrigger EventName="SelectionChanged">
                <GalaSoft_MvvmLight_Command:EventToCommand x:Name="VideoPivotClicked"
                                                            Command="{Binding VideoPivotClicked,  Mode=OneWay}" PassEventArgsToCommand="True" />
            </Custom:EventTrigger>
        </Custom:Interaction.Triggers>

Затем в вашей viewmodel вы добавляете это

      public RelayCommand<SelectionChangedEventArgs> VideoPivotClicked
  {
      get;
      private set;
  }

VideoPivotClicked = new RelayCommand<SelectionChangedEventArgs>(arg =>
                                                       {
                                                           PivotItem pivotItem = arg.AddedItems[0] as PivotItem;
                                                           Pivot pivot = pivotItem.Parent as Pivot;
                                                           Debug.WriteLine(pivot.SelectedIndex);
                                                       }
          );

Вы не получите PivotItem, который вы собираетесь! а не тот, который вы покидаете.

2 голосов
/ 17 мая 2011

Я не использовал MVVM Light напрямую, но вы должны иметь возможность привязать выбранный индекс / элемент к свойству в модели представления.Когда это свойство будет изменено, вы можете переключиться.

0 голосов
/ 17 августа 2011

Я получаю индекс для pivotItem, который я покидаю, а не PivotItem, к которому я иду!.

Используя это:

<controls:Pivot x:Name="pivMain" Title="{Binding AppName}" >
         <Custom:Interaction.Triggers>
            <Custom:EventTrigger EventName="SelectionChanged">
                    <cmd:EventToCommand Command="{Binding SelectServiceCommand}"          
                    CommandParameter="{Binding ElementName=pivMain, Path=SelectedIndex}"/>
             </Custom:EventTrigger>
        </Custom:Interaction.Triggers>
0 голосов
/ 17 мая 2011

Мне нравится сохранять простоту в ситуациях, подобных этим, когда View необходимо уведомить ViewModel о том, что что-то настолько тривиальное изменилось (например: тривиальное изменение выбора в выпадающем списке, которое действительно не имеет никакого отношения к состоянию представления (то есть ViewModel))).

Для вашего конкретного случая в вашем операторе switch просто вызовите публичный метод в вашей ViewModel.Как получить ссылку на viewmodel?Вы можете получить это с помощью DataContext представления.Так что теперь ваши представления могут вызывать открытые методы (и свойства) внутри вашей viewModel.

Для важных вещей придерживаться DataBinding.в противном случае просто позвоните напрямую.Экономит столько времени и хлопот.

...