Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
wpfmvvm设计问题_Wpf_Design Patterns_Mvvm_Class Design - Fatal编程技术网

wpfmvvm设计问题

wpfmvvm设计问题,wpf,design-patterns,mvvm,class-design,Wpf,Design Patterns,Mvvm,Class Design,在我看来,我有一个带有事件“TreeView_MouseLeftButtonDown”的TreeView。如果它触发,则证明鼠标点击了树上的项目。如果没有,则取消选择最后一个TreeView项目。 我的问题是,我应该在代码隐藏中这样做,还是在viewmodel类中调用静态方法?你将如何解决这个问题 方法e: private void treeView_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { if (send

在我看来,我有一个带有事件“TreeView_MouseLeftButtonDown”的TreeView。如果它触发,则证明鼠标点击了树上的项目。如果没有,则取消选择最后一个TreeView项目。 我的问题是,我应该在代码隐藏中这样做,还是在viewmodel类中调用静态方法?你将如何解决这个问题

方法e:

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:


您正试图向树视图添加行为

我实现这一点的方法是使用附加属性。我将创建一个名为
验证leftclick
或类似的附加属性,并在其中实现逻辑。这样,代码隐藏中就不需要事件


有关示例,请参阅。

我使用此处非常详细描述的附加行为为您制作了解决方案

我的解决方案:

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;
                }
            }
        }
    }
}
然后在视图中,您应该添加以下内容:

<TreeView local:TreeViewBehavior.IsResetMouseLeftButtonDown="True">


我希望我的解决方案能达到你们的目的

这里没有任何链接!我对样本也很感兴趣:)我已经阅读了文章和googelt,但我没有看完:-(如果你能给我看一下我的问题的实现就好了:-)@myName我正要发布我的解决方案,但Pawel的代码看起来是正确的。哇,对于这样一件简单的事情来说,这是非常复杂的。我同意可以在代码隐藏中完成,但有些人喜欢使用干净的代码隐藏。我的解决方案还提供了在其他树视图中轻松重用行为的机会。您的取消选择功能不起作用,但该行为非常有效。谢谢你的费用。@myName你说我的取消选择功能不起作用是什么意思?您确定使用的是我的最新代码吗?我已将Xml绑定到我的树视图中这是我需要一个自定义函数来取消选择的方式;-)解决方法如下:
<TreeView local:TreeViewBehavior.IsResetMouseLeftButtonDown="True">