Как отправить в LayoutRoot в RelayCommand через EventToCommand? - PullRequest
3 голосов
/ 21 мая 2010

Пример сетки с триггером:

<Grid x:Name="LayoutRoot" DataContext="{Binding ProjectGrid, Source={StaticResource Locator}}">
<i:Interaction.Triggers>
  <i:EventTrigger EventName="Loaded">
    <GalaSoft_MvvmLight_Command:EventToCommand Command="{Binding LoadedCommand, Mode=OneWay}" PassEventArgsToCommand="True"/>
  </i:EventTrigger>
</i:Interaction.Triggers>

В моей ViewModel я установил LoadedCommand так:

public RelayCommand<RoutedEventArgs> LoadedCommand {get;private set;}

И в инициализаторе ViewModel у меня есть это:

public ProjectGridViewModel()
{
  LoadedCommand = new RelayCommand<RoutedEventArgs>(e => 
    {
      this.DoLoaded(e);
    }
  );
}

Затем в моем DoLoaded я пытаюсь сделать это:

Grid _projectGrid = null;
public void DoLoaded(RoutedEventArgs e)
{
  _projectGrid = e.OriginalSource as Grid;
}

Вы можете видеть, что я пытаюсь избавиться от моего Loaded = "" в моей Grid, и вместо этого выполняю RelayCommand. Проблема в том, что OriginalSource ничего не возвращает. Таким образом, мое загруженное событие работает нормально, но мне нужно включить Grid через RoutedEventArgs, как кажется.

Я попытался передать Grid в EventCommand с помощью CommandParameter = "{Binding ElementName = LayoutRoot}", но это просто приводит к сбою VS2010 при нажатии F5 и запуске проекта.

Есть идеи? Или лучший способ сделать это? Я запустил событие Loaded в представлениях C #, а затем вызвал ViewModel в выделенном коде Views, но я хотел бы сделать более приятное связывание. Разговор с ViewMode в коде сзади Views выглядит как хак.

1 Ответ

4 голосов
/ 21 мая 2010

Вы можете попытаться привязать CommandParameter к EventToCommand:

<GalaSoft_MvvmLight_Command:EventToCommand Command="{Binding LoadedCommand, Mode=OneWay}" CommandParameter="{Binding ElementName=LayoutRoot}" PassEventArgsToCommand="True"/>

Тогда ваш код будет:

public RelayCommand<UIElement> LoadedCommand {get;private set;} 

public ProjectGridViewModel() 
{ 
  LoadedCommand = new RelayCommand<UIElement>(e =>  
    { 
      this.DoLoaded(e); 
    } 
  ); 
} 

Grid _projectGrid = null; 
public void DoLoaded(UIElement e) 
{ 
  _projectGrid = e; 
} 

Должно работать нормально :) 1007 *

Bye.

...