2017-01-31 7 views
1

MVVM Light를 사용하는 WPF 프로젝트가 있습니다. 프로젝트 페이지의 ConnectionPageConnected 이벤트를 발생시킬 수있는 UserControl (ctlSqlConnection)이 있습니다. MVC Light을 사용하여 EventToCommand과 함께이 이벤트를 가로 채고 ConnectionPage의 viewmodel (UserControl 자신의 ViewModel 아님)에서 NavigateToDatabasePageCommand이라는 명령을 실행하지만 작동하지 않는 것 같습니다. 즉, 아무 일도 일어나지 않고 있습니다.MVVM Light에서 UserControl 이벤트가 인터셉트되지 않는 문제 EventToCommand

ConnectionPageDataContext은 페이지 UI가 올바르게 채워지기 때문에 잘 설정되어 있습니다.

나는 전통적인 .NET 처리기를 유선으로 연결 했으므로 이벤트가 발생하고 있음을 알고 있습니다.

MVVM Light 버전 5.3을 사용하고 있습니다.

감사합니다. 저는 MVVM과 툴킷을 처음 접했으므로 어리석은 짓을하기를 기대합니다.

업데이트 : 난 이후

public event EventHandler<ConnectionSettingViewModel> Connected; 

로 선언 해당 UserControl에서 이벤트 자체 검토 한하지만 내가 좋아하는 대신 다른 비 일반적인 이벤트 핸들러를 넣을 때

 public event EventHandler ConnectedWithNoArgs; 

이 있습니다 그것은 작동!?

그래서,

  1. 는 그 상호 작용의 부분은 일반적인 이벤트 선언을 처리 할 수없는 의미 하는가, 아니면 바로 뭔가를하고 있지 않다?

    <Page 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:sys="clr-namespace:System;assembly=mscorlib" 
    x:Class="Views.ConnectionPage" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:data="clr-namespace:Utilities.Data;assembly=Utilities" 
    xmlns:util="clr-namespace:Utilities.Data;assembly=Utilities" 
    xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 
    xmlns:command="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Platform" 
    
    mc:Ignorable="d" 
    d:DesignHeight="300" d:DesignWidth="300" 
    Title="ConnectionPage" 
    DataContext="{Binding Source={StaticResource Locator}, Path=ConnectionPageViewModel}" x:Name="connPage" > 
    
    <Grid x:Name="rootGrid"> 
        <Grid.RowDefinitions> 
         <RowDefinition Height="Auto"/> 
         <RowDefinition/> 
        </Grid.RowDefinitions> 
    
        <Label Grid.Row="0" Content="Create/Select Sql Server connection" Style="{StaticResource HeaderStyle}"/> 
    
        <util:SqlServerConnectionControl Grid.Row="1" x:Name="ctlSqlConnection" DataContext="{Binding SqlServerConnectionControlViewModel}"> 
         <i:Interaction.Triggers> 
          <i:EventTrigger EventName="Connected"> 
           <command:EventToCommand Command="{Binding ElementName=connPage, Path=DataContext.NavigateToDatabasePageCommand}" /> 
          </i:EventTrigger> 
         </i:Interaction.Triggers> 
        </util:SqlServerConnectionControl> 
    </Grid> 
    
    다음

    ConnectionPageViewModel입니다 :

  2. 가 어떻게이 탐색() 메소드 여기

에 이벤트에서있는 EventArgs를 전달하는 얻을 것입니다 것은 ConnectionPage에 대한 XAML입니다

public class ConnectionPageViewModel : ViewModelBase 
{ 
    SqlServerConnectionControlViewModel _serverCtrlVM; 
    Avalon _avalon; 
    IFrameNavigationService _navService; 

    public ConnectionPageViewModel(IFrameNavigationService navigationService, Avalon avalon) 
    { 
     _avalon = avalon; 
     _navService = navigationService; 
     _serverCtrlVM = new SqlServerConnectionControlViewModel(avalon.ConnectionStringManager); 

     NavigateToDatabasePageCommand = new RelayCommand(Nav); 
    } 
    private void Nav() 
    { 
     // NOT GETTING HERE!!! 
     _navService.NavigateTo("DatabasePage"); 
    } 

    public SqlServerConnectionControlViewModel SqlServerConnectionControlViewModel 
    { 
     get { return _serverCtrlVM; } 
    } 

    public RelayCommand NavigateToDatabasePageCommand { get; private set; } 

} 

답변

1

좋아, 나는 fi라고 생각한다. 이것이 다른 누구에게 도움이되는 경우를 대비하여 그것을 찾아 냈습니다.

Connected 이벤트 내가 EventToCommand XAML에 PassEventArgsToCommand="True"을 추가 public event EventHandler<ConnectionSettingViewModelEventArgs> Connected;

입니다. RelayCommandRelayCommand<T>으로 변경했습니다. 여기서 T : EventArgs (이것은 중요한 비트입니다!) ConnectionSettingViewModelEventArgs을 T로 사용했습니다.