将自定义路由事件的用户控件添加到wpf中窗口的xaml

时间:2010-09-01 15:05:12

标签: wpf wpf-controls

我对Command绑定没什么新意,所以对许多人来说这可能是一个微不足道的问题。我知道我们可以在窗口的xaml中添加Command绑定,并在viewmodel中给出它的对应属性。该视图模型将被赋予窗口的DataContext。类似于以下内容

- app.xaml.cs

mainWindow.DataContext = viewModel;

- xaml

lt;Button Grid.Row="1" HorizontalAlignment="Right" Margin="0,3,18,3" Name="button1" Width="110" 
                Command="{Binding LoadCommand}">_Load</Button>

- viewmodel

/// <summary>
        /// Gets the load command.
        /// </summary>
        /// <value>The load command.</value>
        public ICommand LoadCommand
        {
            get
            {
                if (m_LoadCommand == null)
                {
                    m_LoadCommand = new RelayCommand(param => CanLoad(), param => Load());
                }

                return m_LoadCommand;
            }
        }

这里的relaycommand是一个实现ICommand接口的类。 CanLoad()和Load()是分别为relay命令执行canexecute和执行操作的方法。这是处理按钮的单击事件。

我有一个用户控件,其中注册了自定义routedevent,然后在窗口上使用用户控件。我目前正在代码中明确添加事件处理程序。

//hook up event listeners on the actual UserControl instance
            this.ucCustomEvent1.CustomClick += new RoutedEventHandler(ucCustomEvent_CustomClick);
            //hook up event listeners on the main window (Window1)
            this.AddHandler(UserControlThatCreatesEvent.CustomClickEvent, new RoutedEventHandler(ucCustomEvent_CustomClick));

我不想在代码中显式地挂接routedevent,但是在xaml中以与按钮示例中类似的方式。我上传了工作示例代码here供您阅读。

1 个答案:

答案 0 :(得分:2)

我不确定我是否完全理解你的问题,但我希望下面的一个答案会帮助你解决问题。

要在XAML中附加“直接”事件处理程序,只需执行以下操作:

<c:MyUserControl x:Name="uc1" CustomClick="uc1_CustomClickHandler"/>

将一个元素(例如示例中的CustomClick事件)的(路由)事件的处理程序连接到另一个元素(例如父窗口):

<Window c:MyUserControl.CustomClick="ucCustomEvent_CustomClick"/>

现在,如果您想将UI中的事件与ViewModel中的Command绑定,则需要附加行为来执行此操作。有许多框架围绕着它的不同实现。这是你可以尝试的一个:http://sachabarber.net/?p=514。它允许您在代码中执行以下操作:

 <c:MyUserControl local:CommandBehavior.RoutedEventName="MyCustomClick"
                  local:CommandBehavior.TheCommandToRun="{Binding MyViewModelCommand}"/>

希望这有帮助。