我有一个WPF项目,我正在使用MVVM Light。在项目的页面ConnectionPage
上,我有一个可以引发ctlSqlConnection
事件的UserControl(Connected
)。我正在尝试使用MVVM Light来拦截此事件EventToCommand
并在NavigateToDatabasePageCommand
的viewmodel上执行名为ConnectionPage
的命令(而不是UserControl自己的ViewModel) !),但这似乎不起作用。也就是说,什么也没发生。
正确填充页面的UI时,DataContext
的{{1}}设置正常。
我知道事件正在被提出,因为我还连接了一个传统的.NET处理程序,而且这个正在受到攻击。
我正在使用MVVM Light的5.3版,以防它有任何影响吗?
我是MVVM和工具包的新手,所以我希望我能做些傻事。
我在UserControl中查看了事件本身,该事件被声明为
ConnectionPage
但是当我把另一个非通用事件处理程序改为:
public event EventHandler<ConnectionSettingViewModel> Connected;
这使它有效!?
所以,
以下是 public event EventHandler ConnectedWithNoArgs;
的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
答案 0 :(得分:1)
好的,我想我已经弄清楚了,以防这对其他人有帮助。
Connected
事件是
public event EventHandler<ConnectionSettingViewModelEventArgs> Connected;
我将PassEventArgsToCommand="True"
添加到EventToCommand
xaml。
我将RelayCommand
更改为RelayCommand<T>
,其中T:EventArgs(这是重要的位!)并使用ConnectionSettingViewModelEventArgs
作为T.