Пример сетки с триггером:
<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 выглядит как хак.