Проблема с событием UserControl, не перехваченным с помощью MVVM Light EventToCommand
У меня есть проект WPF, где я использую MVVM Light. На странице проекта ConnectionPage
У меня есть UserControl (ctlSqlConnection
) что может поднять Connected
событие. Я пытаюсь использовать MVVM Light для перехвата этого события EventToCommand
и выполнить команду под названием NavigateToDatabasePageCommand
на ConnectionPage
Viewmodel (не собственная ViewModel!), но, похоже, это не работает. То есть ничего не происходит.
DataContext
из ConnectionPage
устанавливается нормально, поскольку пользовательский интерфейс страницы заполняется правильно.
Я знаю, что событие поднимается, так как я также подключил традиционный обработчик.NET, и это происходит.
Я использую версию 5.3 MVVM Light, если это имеет какое-либо отношение?
Буду признателен за любую помощь в этом. Я новичок в MVVM и инструментарии, поэтому я ожидаю, что делаю что-то глупое.
ОБНОВЛЕНИЕ: С тех пор я посмотрел на само событие в UserControl, который объявлен как
public event EventHandler<ConnectionSettingViewModel> Connected;
Но когда я ставлю другой не универсальный обработчик событий, например:
public event EventHandler ConnectedWithNoArgs;
это заставляет это работать!?
Так,
- Означает ли это, что часть Interaction не может иметь дело с общими объявлениями событий, или я что-то не так делаю?
- Как бы я мог передать EventArgs из события в метод Nav()
Вот XAML для ConnectionPage
:
<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
:
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 ответ
Хорошо, я думаю, я понял это на случай, если это поможет кому-то еще.
Connected
Событиеpublic event EventHandler<ConnectionSettingViewModelEventArgs> Connected;
я добавил PassEventArgsToCommand="True"
к EventToCommand
XAML. Я изменился RelayCommand
в RelayCommand<T>
где T: EventArgs (это важный бит!) и используется ConnectionSettingViewModelEventArgs
как т.