gpt4 book ai didi

c# - 如何让双击编辑在我的 ListView 中的一行上工作?

转载 作者:行者123 更新时间:2023-12-03 10:57:50 25 4
gpt4 key购买 nike

我有一个带有gridview 的简单 ListView 来显示每一行。

我为删除添加了一个键绑定(bind),它工作正常。

 <ListView.InputBindings>
<KeyBinding Key="Delete" Command="{Binding Path=DeleteKeyCommand}" CommandParameter="{Binding ElementName=DatabasesLstVw, Path=SelectedItem}"/>
</ListView.InputBindings>

但是当我为 LeftDoubleClick 添加鼠标绑定(bind)来编辑它时,它不会触发命令。
 <MouseBinding Gesture="LeftDoubleClick" Command="{Binding Path=LeftDoubleClickCommand}" CommandParameter="{Binding ElementName=DatabasesLstVw, Path=SelectedItem}" />

在花了最后两个小时试图弄清楚我唯一想到的是它触发了双击整个 ListView 而不是 ListView 项???

如何让双击编辑在我的 ListView 中的一行上工作?我正在使用 MVVM,我不想破坏它,所以我不能使用后面的代码来破解它。必须有一种方法可以将命令映射回我的 View 模型。

更新更多代码:
 <ListView x:Name="DatabasesLstVw" ItemsSource="{Binding Path=ClientDetails.Databases}" ItemContainerStyle="{StaticResource alternatingStyle}" AlternationCount="2" Grid.Row="2" Grid.ColumnSpan="4" VerticalAlignment="Top" >                
<ListView.InputBindings>
<KeyBinding Key="Delete" Command="{Binding Path=DeleteKeyCommand}" CommandParameter="{Binding ElementName=DatabasesLstVw, Path=SelectedItem}"/>
<MouseBinding Gesture="LeftDoubleClick" Command="{Binding Path=LeftDoubleClickCommand}" CommandParameter="{Binding ElementName=DatabasesLstVw, Path=SelectedItem}" />
</ListView.InputBindings>

最佳答案

作为referenced answer缺少一些代码,应该是这样的:

    public class AddToInputBinding
{
public static System.Windows.Input.InputBinding GetBinding(DependencyObject obj)
{
return (System.Windows.Input.InputBinding)obj.GetValue(BindingProp);
}

public static void SetBinding(DependencyObject obj, System.Windows.Input.InputBinding value)
{
obj.SetValue(BindingProp, value);
}


public static readonly DependencyProperty BindingProp = DependencyProperty.RegisterAttached(
"Binding", typeof(System.Windows.Input.InputBinding), typeof(AddToInputBinding), new PropertyMetadata
{
PropertyChangedCallback = (obj, e) =>
{
((UIElement)obj).InputBindings.Add((System.Windows.Input.InputBinding)e.NewValue);
}
});
}

然后,在您的 XAML 中,您将执行以下操作:
<Window x:Class="WpfApplication.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication"
Title="Window1" Height="300" Width="300">
<Window.Resources>
<ResourceDictionary>
<Style TargetType="ListViewItem">
<Setter Property="local:AddToInputBinding.Binding">
<Setter.Value>
<MouseBinding Gesture="LeftDoubleClick" Command="{Binding DataContext.ItemDoubleClick,
RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}"
CommandParameter="{Binding}"/>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
</Window.Resources>
<Grid>
<ListView ItemsSource="{Binding Patients}">
<ListView.View>
<GridView>
<GridViewColumn Header="Test" />
</GridView>

</ListView.View>
</ListView>

</Grid>

在您的 viewModel 中,命令定义如下所示:
    RelayCommand<string> _ItemDoubleClick;
public ICommand ItemDoubleClick
{
get
{
if (_ItemDoubleClick == null)
{
_ItemDoubleClick = new RelayCommand<string>(this.ItemDoubleClickExecuted,
param => this.ItemDoubleClickCanExecute());

}
return _ItemDoubleClick;
}
}

private bool ItemDoubleClickCanExecute()
{
return true;
}

private void ItemDoubleClickExecuted(string item)
{
//In item you've got the text of double clicked ListViewItem
}

请注意,在此示例中,ListView 绑定(bind)了 ObservableCollection是字符串类型。如果这是其他类型,您应该更改 ICommand 定义中的类型。不要忘记将 Window DataContext 设置为您的 ViewModel。
希望这现在更清楚了。

关于c# - 如何让双击编辑在我的 ListView 中的一行上工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36983208/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com