2016-12-14 3 views
0

В моем приложении Windows 10 Windows я хочу очистить код от событий и других вещей и сделать все в ViewModel, поэтому я использую Core: InvokeCommandAction для вызова команды в виртуальной машине, но я не знаю, как передать его отправителю и аргументы для события, переключение объекта кадраКак передать отправителя и аргументы события вызванной команде в ViewModel

<Frame x:Name="MyFrame" SourcePageType="{Binding MainFramePageType, Mode=TwoWay}"> 
    <Interactivity:Interaction.Behaviors> 
     <Core:EventTriggerBehavior EventName="Navigated"> 
      <Core:InvokeCommandAction Command="{Binding MyFrameNavigatedCommand}" CommandParameter="{Binding ElementName=MyFrame}"/>    
     </Core:EventTriggerBehavior> 
    </Interactivity:Interaction.Behaviors> 
</Frame> 

в VM:

public RelayCommand<object> MyFrameNavigatedCommand { get; private set; } 

... 
MyFrameNavigatedCommand = new RelayCommand<object>(MyNavigatedCommandExecuted); 
... 

private void MyNavigatedCommandExecuted(object sender) 
{ 
    (sender as Frame).BackStack.Clear(); 
} 

ответ

0

EventTriggerBehavior передает объект EventArgs каждому действию, поэтому для InvokeCommandAction вам просто нужна команда bound, чтобы принять параметр в реализации вашей команды. Я не знаком с MVVMLight на 100%, но вы, вероятно, используете какую-то команду «делегировать команду»; просто убедитесь, что у вашего делегата есть параметр, и вы все в порядке.

Если вам нужен аргумент sender, то это, скорее всего, указание на то, что вы не должны делать то, что вам нужно делать с ним в модели представления (непосредственный доступ к/изменение вида - это не роль представления модель). Тем не менее, можно передать аргумент отправителя, если вы используете для привязки события к вашей модели представления вместо EventTriggerBehavior (x:Bind требует юбилейного обновления SDK).

XAML

<Frame x:Name="MyFrame" 
     SourcePageType="{Binding MainFramePageType, Mode=TwoWay}" 
     Navigated="{x:Bind Vm.Navigated}"/> 

код за

public MyViewModel Vm => (MyViewModel)DataContext; 

Посмотреть модель

public void Navigated(object sender, NavigationEventArgs e) 
{ 
} 

В качестве альтернативы вы можете сохранить то, что у вас есть, но просто выставить на свой взгляд модель Frame, которую вы можете установить в коде своей страницы.

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

+0

Я понял это о отправителе, но как передать событие args тоже? Я также узнал, что если вы не укажете CommandParameter, отправляются EventArg. Есть ли способ отправить как объект отправителя, так и аргументы события? – nmrlqa4

+0

Извините, я почему-то пропустил часть «отправителя» вашего вопроса. См. Мое редактирование. –

+0

Мне нужно последнее уточнение для лучших практик. Поэтому, оставляя CommandParameter пустым, передает EventArgs в команду и добавление кадра в CommandParameter передает объект команде (если ожидается). Естественно, InvokeCommandAction не предназначен для отправки их обоих одновременно, поэтому мой вопрос заключается в том, что их лучше всего использовать (я полагаю, что оставить CommandParameter пустым, потому что это естественно) с точки зрения того, что вы не просматриваете ViewModel логике View, делая анти-шаблоны. Поскольку я полагал, что не так уж плохо иметь логику событий в кодексе, как решить, что? – nmrlqa4

Смежные вопросы