2010-05-21 6 views
3

그리드 예 : 내 뷰 모델에서EventToCommand를 통해 어떻게 RelayCommand에 LayoutRoot를 보냅니 까? 트리거와

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

나는이 같은 LoadedCommand 설정 :

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

을 그리고 뷰 모델 초기화에 나는이 있습니다

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

그런 다음 내 DoLoaded에서 나는이 작업을 수행하기 위해 노력하고있어 :

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

당신은 내가보기에 내 그리드에 = ""내로드를 제거하기 위해 노력하고있어보고, 대신 RelayCommand을 수행 할 수 있습니다 . 원본 소스가 가져 오는 문제는 없습니다.로드 된 이벤트가 이런 방식으로 실행되고 있지만 RoutedEventArgs를 통해 Grid를 가져와야합니다.

CommandParameter = "{Binding ElementName = LayoutRoot}"인 EventCommand에서 Grid를 통과 시키려고했으나 F5를 누르고 프로젝트를 실행할 때 VS2010이 충돌합니다.

아이디어가 있으십니까? 또는 이것을하는 더 좋은 방법? Loaded 이벤트를 C#에서 실행 한 다음 Views 코드 숨김에서 ViewModel을 호출했지만 더 나은 바인딩을 수행하고 싶습니다. Views 코드 숨김에서 ViewMode에 대해 말하면 해킹처럼 느껴진다.

답변

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

그것은 잘 작동합니다 :)

안녕을.

+0

그랬습니다. Thx bud ... lifesaver :) 나는 다른 사람들도 이것을 원할 것이 틀림 없다. 웹 검색 중 아무것도 발견하지 못할 것이다. – user298145