3

トリガーを使用したグリッドの例:

<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 と対話するのはハックのように感じます。

4

1 に答える 1

4

EventToCommand の CommandParameter をバインドしようとすることができます。

<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; 
} 

それはうまくいくはずです:)

さよなら。

于 2010-05-21T07:06:17.180 に答える