我正在尝试在用户点击ListView中的项目时在我的ViewModel中执行命令。当我在XAML中添加ListViewItem
时,我只需向其MouseBinding
添加InputBindings
。
<ListView>
<ListView.View>
<GridView>
<GridViewColumn Header="Test" />
</GridView>
</ListView.View>
<ListViewItem Content="Item 1" >
<ListViewItem.InputBindings>
<MouseBinding Gesture="LeftDoubleClick" Command="{Binding DoubleClickCommand}" />
</ListViewItem.InputBindings>
</ListViewItem>
</ListView>
但是如何在数据绑定ListView中实现?
<ListView ItemsSource="{Binding Patients}">
<ListView.View>
<GridView>
<GridViewColumn Header="Test" />
</GridView>
<!-- How to set the MouseBinding for the generated ListViewItems?? -->
</ListView.View>
我已经通过定义ListViewItem
样式并替换ControlTempalte
的{{1}}来获得解决方案。虽然,我希望有一个更容易的解决方案。
此致 迈克尔
答案 0 :(得分:5)
使用样式替换ControlTemplate
上的ListViewItem
并不是一个糟糕的解决方案。事实上,这可能是我的第一选择。
实现同一类型的另一种方法是在ListViewItem
样式上使用自定义附加属性:
<Style TargetType="ListViewItem">
<Setter Property="local:AddToInputBinding.Binding">
<Setter.Value>
<MouseBinding Gesture="LeftDoubleClick" Command="{Binding DoubleClickCommand}" />
</Setter.Value>
</Setter>
...
为此,您需要创建MyBindingHandler.AddBinding附加属性:
public class AddToInputBinding
{
public static InputBinding GetBinding(... // create using propa snippet
public static void SetBinding(...
public static readonly DependencyProperty BindingProperty = DependencyProperty.RegisterAttached(
"Binding", typeof(InputBinding), typeof(AddToInputBinding), new PropertyMetadata
{
PropertyChangedCallback = (obj, e) =>
{
((UIElement)obj).InputBindings.Add((InputBinding)e.NewValue);
}
}));
}
这可以扩展为处理多个绑定,但你明白了:这个类允许你在任何样式中添加一个InputBinding。
此解决方案可能比您正在执行的操作更受欢迎,因为DoubleClick绑定直接在ListBoxItem上定义,而不是在其模板内的其他控件上定义。但我认为这主要归结为个人偏好。
答案 1 :(得分:1)
我能够通过以下方式解决这个问题:
1)我添加了对System.Windows.Interactivity
DLL的引用(在C:\Program Files (x86)\Microsoft SDKs\Expression\Blend\.NETFramework\v4.0\Libraries
中找到)
2)将此添加到我的XAML文件中:
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
3)在我的ListView中添加了这个:
<ListView ...>
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseDoubleClick">
<i:InvokeCommandAction Command="{x:Static local:MainWindow.RoutedCommandEditSelectedRecordWindow}" />
</i:EventTrigger>
</i:Interaction.Triggers>
...
</ListView>