【问题标题】:Issue with UserControl event not being intercepted with MVVM Light EventToCommandMVVM Light EventToCommand 未拦截 UserControl 事件的问题
【发布时间】:2017-06-17 01:00:09
【问题描述】:

我有一个使用 MVVM Light 的 WPF 项目。在项目的页面ConnectionPage 上,我有一个可以引发Connected 事件的UserControl (ctlSqlConnection)。我正在尝试使用 MVVM Light 通过EventToCommand 拦截此事件并在ConnectionPage 的视图模型(不是UserControl 自己的视图模型!)上执行一个名为NavigateToDatabasePageCommand 的命令,但这似乎不起作用。也就是说,什么都没有发生。

ConnectionPageDataContext 设置正常,因为页面的 UI 已正确填充。

我知道该事件正在引发,因为我还连接了一个传统的 .NET 处理程序并且它正在被命中。

我正在使用 MVVM Light 5.3 版,以防万一这有任何影响?

我是 MVVM 和工具包的新手,所以我认为我在做一些傻事。

更新

我已经在声明为

的 UserControl 中查看了事件本身
public event EventHandler<ConnectionSettingViewModel> Connected;

但是当我把另一个非通用事件处理程序改为:

        public event EventHandler ConnectedWithNoArgs;

这让它工作了!?

所以,

  1. 这是否意味着交互部分无法处理通用事件声明,或者我做的不对?
  2. 如何将 EventArgs 从事件传递到 Nav() 方法

这是ConnectionPage 的 XAML:

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

}

【问题讨论】:

    标签: c# wpf mvvm mvvm-light eventtocommand


    【解决方案1】:

    好的,我想我已经想通了,以防这对其他人有帮助。

    Connected 事件是 public event EventHandler&lt;ConnectionSettingViewModelEventArgs&gt; Connected;

    我将PassEventArgsToCommand="True" 添加到EventToCommand xaml。 我将RelayCommand 更改为RelayCommand&lt;T&gt;,其中T:EventArgs(这是重要的一点!)并使用ConnectionSettingViewModelEventArgs 作为T。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-18
      • 1970-01-01
      • 2012-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-23
      相关资源
      最近更新 更多