WPF中如何将StackPanel鼠标事件绑定到ViewModel命令?
问题原因与解决方法
你的绑定失效核心原因是:DataTemplate内部元素的默认DataContext是ListView集合中的单个数据项,而MouseLeftButtonDownCommand是定义在窗口的ViewModel(vm:Ticker)里,直接绑定会在当前数据项里查找这个命令,自然找不到。
要解决这个问题,你需要明确指定命令绑定的上下文为窗口的ViewModel,有两种常用实现方式:
方式一:使用RelativeSource向上查找Window的DataContext
修改InvokeCommandAction的Command绑定,通过RelativeSource找到上级Window,再访问其DataContext中的命令:
<StackPanel Orientation="Horizontal" Name="STPListView"> <i:Interaction.Triggers> <i:EventTrigger EventName="MouseLeftButtonDown"> <i:InvokeCommandAction Command="{Binding DataContext.MouseLeftButtonDownCommand, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" CommandParameter="{Binding ElementName=STPListView}"/> </i:EventTrigger> </i:Interaction.Triggers> <TextBlock Width="130" Text="{Binding Market}" Foreground="WhiteSmoke"/> <TextBlock Width="110" Text="{Binding Price}" Foreground="{Binding LastPrice, Converter={StaticResource BoolToForeground}}"/> </StackPanel>
方式二:给Window命名,通过ElementName绑定
先给你的Window添加x:Name属性:
<Window x:Name="MainWindow" ...> <Window.DataContext> <vm:Ticker/> </Window.DataContext> <!-- 其他代码 --> </Window>
然后修改命令绑定,通过ElementName指向Window的DataContext:
<i:InvokeCommandAction Command="{Binding DataContext.MouseLeftButtonDownCommand, ElementName=MainWindow}" CommandParameter="{Binding ElementName=STPListView}"/>
两种方式都能让命令正确绑定到窗口的ViewModel上,你可以根据习惯选择其中一种。
内容的提问来源于stack exchange,提问作者EmilAv
相关产品推荐
相关产品推荐

