我有一个列表框,我需要在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。我怎样才能做到这一点。
此致 迪帕克
答案 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
}
}
很好,干净,没有代码隐藏。