如何从后面的代码委托对ViewModel的调用

时间:2014-08-14 13:56:19

标签: c# wpf mvvm delegates

我有一个列表框,我需要在DoubleClick事件上做点什么。我只需使用ListBox的“MouseDoubleClick”事件即可实现此目的。

XAML

<ListBox x:Name="lbSelectedTables" AllowDrop="true" ItemsSource="{Binding SelectedTablesCollection, Mode=TwoWay}" DisplayMemberPath="Name" ItemContainerStyle="{StaticResource DraggableListBoxItem}" MouseDoubleClick="ListBox_MouseDoubleClick" SelectionMode="Multiple"></ListBox>

代码背后

private void ListBox_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    .....
    My stuff here....
}

现在我想将此调用委托给ViewModel。我怎样才能做到这一点。

此致 迪帕克

2 个答案:

答案 0 :(得分:0)

您可以使用控件的DataContext

private void ListBox_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    (this.DataContext as ViewModel).HandleClick(...);
}

如果您要调用的ViewModel是Control的ViewModel,如果您希望使用ListBox绑定的ViewModel,则此方法有效:

private void ListBox_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    (lbSelectedTables.DataContext as ViewModel).HandleClick(...);
}

答案 1 :(得分:0)

您可以使用galasoft MVVM light和System.Windows.Interactivity,并将委托直接作为命令耦合到您的viewmodel,方法如下。 (仅通过nuget获取MVVMLight lib。)

...
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:command="http://www.galasoft.ch/mvvmlight"
xmlns:local="clr-namespace:yournamespace"
...

<UserControl.DataContext>
   <local:YourViewModel />
<UserControl.DataContext/>

<ListBox AllowDrop="true" ItemsSource="{Binding SelectedTablesCollection, Mode=TwoWay}" DisplayMemberPath="Name" ItemContainerStyle="{StaticResource DraggableListBoxItem}" SelectionMode="Multiple">
 <i:Interaction.Triggers>
                <i:EventTrigger EventName="MouseDoubleClick">
                    <command:EventToCommand Command="{Binding YourCommand}" PassEventArgsToCommand="True"/>
                </i:EventTrigger>
            </i:Interaction.Triggers>
</ListBox>

在你的viewmodel中:

public class YourViewModel: YourViewModelBaseClass {
   public ICommand YourCommand{ get; set; }

   public ViewModelOrCodeBehind() {
      InitStuff();
   }

   void  InitStuff(){
      YourCommand = new RelayCommand<MouseButtonEventArgs>(YourMethod);
   }

   void YourMethod(MouseButtonEventArgs e)
   {
       // Do your magic here
   }
}

很好,干净,没有代码隐藏。