【问题标题】:Problems Binding MouseDoubleClick via M-V-MV Design Pattern通过 M-V-MV 设计模式绑定 MouseDoubleClick 的问题
【发布时间】:2012-03-21 19:28:02
【问题描述】:

我在 .xaml 文件中有以下 sn-p 代码:

<TreeView MouseDoubleClick="TreeView_MouseDoubleClick" ItemsSource="{Binding MyList}">
  <TreeView.ItemContainerStyle>
    <Style TargetType="{x:Type TreeViewItem}">
      <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" />
      <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
      <Setter Property="FontWeight" Value="Normal" />
      <Style.Triggers>
        <Trigger Property="IsSelected" Value="True">
          <Setter Property="FontWeight" Value="Bold" />
        </Trigger>
      </Style.Triggers>
    </Style>
  </TreeView.ItemContainerStyle>

如您所见,当您在 TreeView 中的某个项目上“MouseDoubleClick”时,它将执行后面代码中的代码......即......

private void TreeView_MouseDoubleClick(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
    try
    {
        MessageBox.Show(((TreeViewWithViewModelDemo.LoadOnDemand.HtmlFileViewModel)(((System.Windows.Controls.TreeView)(sender)).SelectedValue)).HtmlFileName);
    }
    catch
    {
    }
}

我正在尝试遵循 Model-View-ViewModel 设计模式,并希望将此 MouseDoubleClick 事件的实现从 View 移到 ViewModel 中。

我知道,如果我使用命令,我会使用 {Binding Command="Select"}(或实现 ICommand 接口的类似命令),但我似乎无法找到此特定问题的语法,因为它不是命令按钮。

谁能帮帮我?

谢谢

【问题讨论】:

    标签: c# wpf xaml


    【解决方案1】:

    这是一个使用 Blend 的交互触发器的解决方案。

    <Page.DataContext>
        <Samples:TreeViewDblClickViewModel/>
    </Page.DataContext>
    <Grid>
        <TreeView ItemsSource="{Binding Items}">
            <TreeView.ItemTemplate>
                <DataTemplate>
                    <ContentControl>
                        <i:Interaction.Triggers>
                            <i:EventTrigger EventName="MouseDoubleClick">
                                <i:InvokeCommandAction Command="{Binding DoubleClickCommand}"/>
                            </i:EventTrigger>
                        </i:Interaction.Triggers>
                        <TextBlock Text="{Binding Name}" Background="AliceBlue" Margin="2"/>
                    </ContentControl>
                </DataTemplate>
            </TreeView.ItemTemplate>
        </TreeView>
    </Grid>
    

    查看模型

    public class TreeViewDblClickViewModel
    {
        public TreeViewDblClickViewModel()
        {
            Items = new List<TreeViewDblClickItem>
                        {
                            new TreeViewDblClickItem{ Name = "One"},
                            new TreeViewDblClickItem{ Name = "Two"},
                            new TreeViewDblClickItem{ Name = "Thee"},
                            new TreeViewDblClickItem{ Name = "Four"},
                        };
        }
    
        public IList<TreeViewDblClickItem> Items { get; private set; }
    }
    
    public class TreeViewDblClickItem
    {
        public TreeViewDblClickItem()
        {
            DoubleClickCommand = new ActionCommand(DoubleClick);
        }
    
        public string Name { get; set; }
    
        private void DoubleClick()
        {
            Debug.WriteLine("Double click");
        }
    
        public ICommand DoubleClickCommand { get; private set; }
    }
    

    【讨论】:

      【解决方案2】:

      使用 MVVM 并不意味着代码隐藏文件中不能有任何代码。它只是意味着将所有关联的逻辑移动到视图模型中。您可以在视图模型上实现必要的双击方法,然后从后面的代码中调用它:

      _viewModel.MouseDoubleClickOnTree();
      

      另外,我建议你看看这个主题:MVVM C# WPF binding mouse double click

      【讨论】:

      • 有没有办法通过 Xaml 上的 {Binding} 进行操作?
      • 是的。参考的stackoverflow帖子中有链接。使用手势:thejoyofcode.com/… 使用拉莫拉模式:blog.lexique-du-net.com/index.php?post/2010/02/17/…
      • 有什么方法可以让手势使用 {Binding}?我尝试了以下,它抱怨...
      • 没有。手势的命令不是 DependencyProperty,因此它们不能使用绑定。您应该能够在 ResourceDictionary 的 xaml 中声明必要的命令,然后使用 {DynamicResource} 引用它。
      【解决方案3】:

      我建议您开始使用 Prism 等 MVVM 模式库。它解决了一般问题,您可以将时间花在做生意上,而不是重新发明轮子。

      【讨论】:

        【解决方案4】:

        实际上,几天前我就这个话题向某人发布了一个答案。 Here is what I posted

        显然,这是针对 listviewitem,而不是 treeviewitem,但它仍然可以工作,只是有一些细微的变化。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-08-25
          • 2018-10-16
          • 1970-01-01
          • 1970-01-01
          • 2011-04-03
          • 2016-03-10
          相关资源
          最近更新 更多