WPF MVVM дизайн вопрос - PullRequest
       2

WPF MVVM дизайн вопрос

2 голосов
/ 11 апреля 2011

В моем представлении у меня есть TreeView с событием "TreeView_MouseLeftButtonDown". Если это срабатывает, это доказывает, если щелкнуть мышью на TreeViewItem. Если нет, он отменяет выбор последнего TreeViewItem. Мой вопрос, должен ли я сделать это в коде позади или вызвать статический метод в классе viewmodel? Как бы вы решили это?

Метод:

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" />

Ответы [ 2 ]

2 голосов
/ 11 апреля 2011

Вы пытаетесь добавить поведение в TreeView.

Я бы реализовал это, используя Attached Properties . Я хотел бы создать присоединенное свойство с именем VerifiesLeftClick или аналогичное и реализовать там логику. Таким образом, вам не нужно событие в коде позади.

См. здесь для образцов.

0 голосов
/ 11 апреля 2011

Я сделал для вас решение с использованием прикрепленного поведения, которое было довольно хорошо описано здесь Введение в присоединенное поведение в WPF, автор 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">

Я надеюсь, что мое решение сделает то, что вы пытаетесь достичь.

...