2012-03-21 39 views
1

,我有以下在的.xaml文件的代碼片段:問題通過MV-MV設計模式綁定MouseDoubleClick

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

我試圖遵循模型 - 視圖 - 視圖模型設計模式,並想從視圖中移動這個MouseDoubleClick事件的執行遠並進入ViewModel。我知道,如果我使用的是命令,我會使用{Binding Command =「Select」}(或類似的實現ICommand接口的東西),但是我似乎無法找到這個特定問題的語法,因爲它不是一個命令按鈕。

有人可以幫我嗎?

謝謝

回答

3

使用MVVM並不意味着代碼隱藏文件中不能有任何代碼。這意味着將所有關聯的邏輯移動到視圖模型中。你可以只實現對視圖模型需要雙擊方法,並從後面的代碼調用它是這樣的:

_viewModel.MouseDoubleClickOnTree(); 

另外,我建議你看這個題目:MVVM C# WPF binding mouse double click

+0

有沒有辦法通過Xaml上的{Binding}來完成? – 2012-03-21 19:33:48

+0

是的。在引用的stackoverflow帖子中有鏈接。 使用手勢:http://www.thejoyofcode.com/Invoking_a_Command_on_a_Double_Click_or_other_Mouse_Gesture.aspx 使用ramora模式:http://blog.lexique-du-net.com/index.php?post/2010/02/17/Use- AttachedProperties-to-add-behaviour-to-the-components – 2012-03-21 19:39:47

+0

任何獲取手勢的方法{Binding}?我嘗試了以下,它抱怨... 2012-03-21 20:39:02

0

我建議你開始使用像Prism等MVVM模式庫。它解決了一般問題,你可以花時間做生意,而不是重新發明輪子。

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,但它仍然會工作,有一些小的變化。