【问题标题】:Why is event not firing in WPF/MVVM application?为什么 WPF/MVVM 应用程序中没有触发事件?
【发布时间】:2014-04-01 13:34:36
【问题描述】:

我有以下NavBar,Content数据模板标记如下:

<dxn:NavBarControl Name="SideMenuNavBar" DataContext="{Binding}" IsEnabled="{Binding Enabled}" ItemsSource="{Binding Bars}" HorizontalAlignment="Left"  VerticalAlignment="Stretch" Margin="1">
  <dxn:NavBarControl.Resources>
    <Style TargetType="dxn:NavBarGroup">
      <Setter Property="Header" Value="{Binding DisplayText}"/>
      <Setter Property="Content" Value="{Binding MenuItems}"/>
      <Setter Property="DisplaySource" Value="Content"/>
      <Setter Property="ContentTemplate">
        <Setter.Value>
          <DataTemplate>
            <TreeView ItemsSource="{Binding}">
              <TreeView.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding Path=ChildItems}" DataType="{x:Type common:MenuItemBase}">
                  <TextBlock Text="{Binding ItemText}" HorizontalAlignment="Stretch">
                    <TextBlock.ContextMenu>
                      <ContextMenu DataContext="{Binding RelativeSource={RelativeSource Mode=Self}}">
                        <MenuItem Header="{Binding MenuText}" Click="MenuItem_OnClick" />
                      </ContextMenu>
                    </TextBlock.ContextMenu>
                  </TextBlock>
                </HierarchicalDataTemplate>
              </TreeView.ItemTemplate>
            </TreeView>
          </DataTemplate>
        </Setter.Value>
      </Setter>
    </Style>
  </dxn:NavBarControl.Resources>
  <dxn:NavBarControl.View>
    <dxn:NavigationPaneView GroupDisplayMode="Text" ItemDisplayMode="Text" MaxVisibleGroupCount="12"/>
  </dxn:NavBarControl.View>
</dxn:NavBarControl>

绑定正在工作,因为我的一个菜单项树视图正确显示,但是当我单击(MouseDown 事件)时,什么也没发生,或者当我双击以下处理程序时,处理程序不执行:

private void Control_OnMouseDoubleClick(object sender, MouseButtonEventArgs e)
{
  var x = sender;
}

我在var x = sender; 上的断点永远不会被命中。

注意:我知道我不应该使用事件,而应该使用命令,或者其他一些耦合度更低的代码,但我迫切需要演示当用户单击菜单项时会发生什么,以及在事件之前,我的代码命令也没有触发。这里有什么问题?

【问题讨论】:

  • 在哪里注册 MouseDown-Event?我只有MenuItem的Click-Event
  • 你使用的是什么版本的 DevExpress?
  • @Jehof 13.2 现在。

标签: c# wpf mvvm devexpress prism-4


【解决方案1】:

首先:ContextMenu 完全在您的控件之外 VisualTree 所以正常的绑定根本不起作用,除非您按照here 的描述更改绑定

由于您使用的是事件背后的代码,请尝试以下操作:

<MenuItem Header="{Binding MenuText}" MouseDown="MenuItem_MouseDown" />

private void MenuItem_MouseDown(object sender, MouseButtonEventArgs e)
{
  var x = sender;
}

【讨论】:

    【解决方案2】:

    您应该使用命令绑定,确保您绑定到创建命令的同一上下文。

    如果&lt;MenuItem Header="{Binding MenuText}" ...&gt; 绑定正确,那么您应该在相同的上下文中创建一个 RelayCommand。然后通过

    绑定到点击

    &lt;MenuItem Click="{Binding ClickCommand}" ...?

    但如果您需要快速修复,您可以在 NavBarControl 中使用 PreviewMouseButtonDown/Up,然后检查处理程序中点击了什么?

    见:get the name of the element on which I clicked / mousedown

    <dxn:NavBarControl PreviewMouseUp="NavBar_PreviewMouseUp" ...>
    

    在后面的代码中。

    private void NavBar_PreviewMouseUp(object sender, MouseButtonEventArgs e)
    {
        var mouseWasUpOn = e.Source as MenuItem;
        if (mouseWasUpOn != null)
        {
            string header = mouseWasDownOn.Header;
        }
    }
    

    但请注意,如果正常的事件处理程序不起作用,这只是一种解决方法。理想情况下,您应该绑定到命令!

    【讨论】:

    • 是的,我知道,谢谢,但是老板想看看菜单点击是否在视图的适当区域正确打开了一个Delphi窗口。一旦我让Click 事件正常工作,其他事情就很容易了。
    • 我已经尝试使用你所说的命令,但不是DelegateCommand,我得到一个InvalidCastException:“无法将'System.Reflection.RuntimeEventInfo'类型的对象转换为'System .Reflection.MethodInfo'。”我找不到RelayCommand 课程。
    【解决方案3】:

    我对 WPF 很陌生,对 DevExpress WPF 套件也很陌生,所以我只是从某个地方的示例中复制了上面的原始代码。然后我心想,为什么是ContextMenu?然后,我右键单击菜单项,然后出现一个空白上下文菜单项,并触发了该事件。我删除了血腥的上下文菜单,现在我的菜单项正在触发事件,就像我问这个问题时想要的那样。 TreeView的新结构如下:

    <TreeView.ItemTemplate>
      <HierarchicalDataTemplate ItemsSource="{Binding Path=ChildItems}" DataType="{x:Type menus:MenuItemBase}">
        <MenuItem DataContext="{Binding}" Header="{Binding ItemText}" Click="MenuItem_OnClick" />
      </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
    

    我仍在尝试使命令绑定正常工作,但这回答了我关于事件的问题。

    【讨论】:

      猜你喜欢
      • 2016-01-30
      • 1970-01-01
      • 2011-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多