wpf - WPF MVVM设计问题

标签 wpf design-patterns mvvm class-design

在我的 View 中,我有一个带有事件“TreeView_MouseLeftButtonDown”的TreeView。如果触发,则证明鼠标是否单击了TreeViewItem。如果不是,则取消选择最后一个TreeViewItem。
我的问题是,我应该在后台代码中执行此操作还是在viewmodel-class中调用静态方法?您将如何解决?

方法:

private void treeView_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    if (sender != null)
    {
        var treeView = sender as TreeView;
        if (treeView != null && treeView.SelectedItem != null)
            TreeViewHelper.ReturnTreeViewItem(ref treeView, (XmlNode)treeView.SelectedItem).IsSelected = false;
    }
} 

XAML:
<TreeView ... KeyDown="TreeView_KeyDown" 
              MouseLeftButtonDown="TreeView_MouseLeftButtonDown" 
              SelectedItemChanged="TreeView_SelectedItemChanged" />

最佳答案

我使用附加行为为您提供了解决方案,此处已对此进行了很好的描述Introduction to Attached Behaviors in WPF by Josh Smith

我的解决方案:

public static class TreeViewBehavior
{
    public static bool GetIsResetMouseLeftButtonDown(TreeView treeView)
    {
        return (bool)treeView.GetValue(IsResetMouseLeftButtonDownProperty);
    }
    public static void SetIsResetMouseLeftButtonDown(TreeView treeViewItem, bool value)
    {
        treeViewItem.SetValue(IsResetMouseLeftButtonDownProperty, value);
    }
    public static readonly DependencyProperty IsResetMouseLeftButtonDownProperty =
        DependencyProperty.RegisterAttached("PreviewMouseLeftButtonDown", typeof(bool), typeof(TreeViewBehavior),
        new UIPropertyMetadata(false, OnIsMouseLeftButtonDownChanged));
    static void OnIsMouseLeftButtonDownChanged(DependencyObject depObj, DependencyPropertyChangedEventArgs e)
    {
        TreeView item = depObj as TreeView;
        if (item == null)
            return;
        if (e.NewValue is bool == false)
            return;

        if ((bool)e.NewValue)
        {
            item.PreviewMouseLeftButtonDown += OnMouseLeftButtonDown;
        }
        else
        {
            item.MouseLeftButtonDown -= OnMouseLeftButtonDown;
        }
    }
    static void OnMouseLeftButtonDown(object sender, RoutedEventArgs e)
    {
        var tempItem = e.Source as TreeViewItem;
        if (tempItem != null && tempItem.IsSelected == false)
        {
            tempItem.IsSelected = true;
        }
        else
        {
            var tree = e.Source as TreeView;
            if (tree != null && tree.SelectedItem != null)
            {
                var selItem = (tree.SelectedItem as TreeViewItem);
                if (selItem != null)
                {
                    selItem.IsSelected = false;
                }
            }
        }
    }
}

然后在“ View ”中添加以下内容:
<TreeView local:TreeViewBehavior.IsResetMouseLeftButtonDown="True">

我希望我的解决方案能达到您想要实现的目标。

关于wpf - WPF MVVM设计问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5619592/

相关文章:

wpf - 将实现注入(inject)可移植类库的模式是否有名称?

wpf - .ico 中的图像作为 DynamicResource

java - 复合模式: Client treats collections of objects and individual objects uniformly

python - 在 Tornado 中使异步调用同步

WPF MVVM View /用户控件继承或类似概念?

Kendo UI MVVM 中选择选项的 Javascript 设置

wpf - EF EntityObject 不更新关系的数据绑定(bind)

c# - 如何调试具有异步数据访问且没有调用堆栈的 WPF 应用程序?

c# - 如何从加载的图像文件而不是项目资源构建 SplashScreen

javascript - nodejs中的单例模式 - 需要吗?