WPF Datagrid双击单元MVVM设计

mHe*_*pMe 1 c# wpf xaml datagrid mvvm

我有一个包含数据网格的WPF应用程序.它绑定到我的List对象"Orders",如下所示.

public class OrderBlock
{
  public Settings setting;
  public List<Order> orders;
}
public class Order
{
  public int Amount;
  public string OrderID;
  public string OrderIDDup;
  public string Name;
  public string NameDup;
  public bool DupIDs;
  // and some string, int fields
}
Run Code Online (Sandbox Code Playgroud)

由于我无法控制的原因,可能存在多个OrderID,因此可能是OrderIDDup属性.默认情况下,我的datagrid只显示OrderID而不显示OrderIDDup.

我想要做的是让用户能够单击单元格ID并加载另一个窗口以向他们显示另一个ID以及两个名称,并让他们选择应该使用哪个ID.

我一直在读,WPF DataGrid不支持双击单元格的功能.所以我有点迷失,因为我应该如何开始解决这个问题.我能看到的另一个问题是,当我尝试(作为操作词)使用MVVM设计时,这种事件将如何暴露给我的视图模型?

这也是展示此类信息的最佳方式.

任何帮助都会很棒,谢谢,M

bob*_*h75 23

您可以双击网格,而不是双击单元格

<DataGrid.InputBindings>
    <MouseBinding Gesture="LeftDoubleClick" 
    Command="{Binding Edit}" 
    CommandParameter="{Binding ElementName=UsersDataGrid, Path=SelectedItem}" />
</DataGrid.InputBindings>
Run Code Online (Sandbox Code Playgroud)

在ViewModel中

    public ICommand Edit { get; private set; }

 Edit = new RelayCommand(EditUser, x => _isAdmin);



 private static void EditUser(object usr)
    {
        if (!(usr is User))
            return;

        new UserEditorViewModel(usr as User);
    }
Run Code Online (Sandbox Code Playgroud)


小智 6

我们可以通过两种方式做到这一点,

a) 通过使用依赖属性 b) 通过添加 System.Windows.Interactivity.dll。

通常我更喜欢第二种方式。

步骤 1:在视图模型类文件中实现 ICommand 接口。

第 2 步:定义您的命令,

public ICommand DoubleClickCommand
{
//Do your code
}
Run Code Online (Sandbox Code Playgroud)

第2步:将上述.dll添加到相应解决方案的xaml文件中。

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
Run Code Online (Sandbox Code Playgroud)

步骤3:在Datagrid标签内,使用以下代码来实现InvokeCommandAction类

<i:Interaction.Triggers>
       <i:EventTrigger EventName="MouseDoubleClick">
             <i:InvokeCommandAction Command="{Binding DoubleClickCommand}"/>
       </i:EventTrigger>
</i:Interaction.Triggers>
Run Code Online (Sandbox Code Playgroud)

就是这样。希望对你有帮助:)