2012-03-21 3 views
1

У меня есть следующий фрагмент кода в качестве .xaml файла:Проблемы Переплет MouseDoubleClick с помощью MV-MV Design Pattern

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

Как вы можете видеть, когда вы «MouseDoubleClick» на элемент в TreeView он будет выполнить код в код ... а именно ...

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), но я не могу найти синтаксис для этой конкретной проблемы, так как это не командную кнопку.

Может кто-нибудь помочь мне?

Благодаря

ответ

3

Использование MVVM не означает, что не должно быть какой-либо код в файл кода. Это просто означает перемещение всей связанной логики в viewmodel. Вы можете просто реализовать необходимый метод двойного щелчка на ViewModel, и вызывать его из кода позади, как это:

_viewModel.MouseDoubleClickOnTree(); 

Кроме того, я бы рекомендовал смотреть на эту тему: MVVM C# WPF binding mouse double click

+0

Есть ли способ сделать через {Binding} на Xaml? –

+0

Да. В ссылочной записи stackoverflow есть ссылки. Использование жестов: http://www.thejoyofcode.com/Invoking_a_Command_on_a_Double_Click_or_other_Mouse_Gesture.aspx Использование шаблона ramora: http://blog.lexique-du.com/index.php?post/2010/02/17/Use- AttachedProperties-to-add-behaviors-to-components –

+0

Любой способ получить жесты для использования {Binding}? Я попробовал следующее, и он пожаловался ...

0

Я рекомендую вам начать использовать библиотеку для шаблона MVVM, например, Prism и т. д. Он решает общие проблемы, и вы можете потратить свое время на то, чтобы заниматься бизнесом, а не изобретать велосипед.

4

Вот решение, использующее триггеры взаимодействия 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; } 
} 
0

Я на самом деле отправил ответ кому-то об этом очень теме несколько дней назад. Here is what I posted

Очевидно, что это для listviewitem, а не для treeviewitem, но он все равно будет работать с некоторыми незначительными изменениями.