トリガーを使用したグリッドの例:
<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="" を取り除こうとしていて、代わりに RelayCommand を実行しようとしていることがわかります。問題は、OriginalSource が何も返さないことです。ロードされたイベントはこの方法で正常に実行されていますが、RoutedEventArgs を介してグリッドを取得する必要があるようです。
CommandParameter="{Binding ElementName=LayoutRoot}" を使用して EventCommand で Grid を渡そうとしましたが、F5 キーを押してプロジェクトを実行すると、VS2010 がクラッシュします。
何か案は?または、これを行うより良い方法はありますか?ビュー C# で Loaded イベントを実行してから、ビュー コード ビハインドで ViewModel を呼び出しましたが、より適切なバインディングを行いたいと考えています。Views コード ビハインドで ViewMode と対話するのはハックのように感じます。