2

我有一个包含数据网格的 WPF 应用程序。它绑定到我的列表对象“订单”,如下所示。

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
}

由于我无法控制的原因,可能有多个 OrderID,因此 OrderIDDup 属性。默认情况下,我的数据网格只显示 OrderID 而不是 OrderIDDup。

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

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

这也是显示此类信息的最佳方式。

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

4

5 回答 5

26

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

<DataGrid.InputBindings>
    <MouseBinding Gesture="LeftDoubleClick" 
    Command="{Binding Edit}" 
    CommandParameter="{Binding ElementName=UsersDataGrid, Path=SelectedItem}" />
</DataGrid.InputBindings>

在视图模型中

    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);
    }
于 2013-09-03T15:50:47.327 回答
3

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

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

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

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

第2步:定义你的命令,

public ICommand DoubleClickCommand
{
//Do your code
}

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

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"

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

<i:Interaction.Triggers>
       <i:EventTrigger EventName="MouseDoubleClick">
             <i:InvokeCommandAction Command="DoubleClickCommand"/>
       </i:EventTrigger>
<i:Interaction.Triggers>

而已。希望对你有帮助:)

于 2014-06-17T05:32:26.657 回答
1
private void DataGrid_MouseDoubleClick(object sender, MouseButtonEventArgs eventArgs)
{
    if (sender == null) return;
    if (eventArgs.ButtonState != MouseButtonState.Pressed) return; //only react on pressed

    var dataGrid = sender as DataGrid;
    if (dataGrid == null || dataGrid.SelectedItems == null) return;

    if (dataGrid.SelectedItems.Count == 1)
    {
        var simplePension = dataGrid.SelectedItem as ISimplePension;
        if (simplePension != null)
        {
            DataFetcherHolder.DataFetcher.SelectPension(simplePension);
            Execute(EditSelectedPensionFunction);
        }
    }
}
于 2013-11-16T17:25:27.037 回答
0

我用过 MouseDoubleClick:

    private void DataGrid_MouseDoubleClick(object sender, MouseButtonEventArgs eventArgs)
    {
        if (sender == null) return;
        if (eventArgs.ButtonState != MouseButtonState.Pressed) return; //only react on pressed

        var dataGrid = sender as DataGrid;
        if (dataGrid == null || dataGrid.SelectedItems == null) return;

        if (dataGrid.SelectedItems.Count == 1)
        {
            var simplePension = dataGrid.SelectedItem as ISimplePension;
            if (simplePension != null)
            {
                DataFetcherHolder.DataFetcher.SelectPension(simplePension);
                Execute(EditSelectedPensionFunction);
            }
        }
    }

当你双击一个数据网格时,该行也被选中,所以我只是找到选中的项目并使用它。

于 2013-09-10T12:32:30.213 回答
0

假设

  1. 作为 MyGridDataList 的 DataGrid
  2. 选定行的 Griddata 作为 MyGridData
public Icollection<MyGridData> MyGridTable {get; private set;}
public MyGridData MyData {get; private set;}

public MyClass()
{
    MyGridData = new MyGridData();
    /// assume datas had set
    MyGridTable = new ObservableCollection<MyGridData>();
    MyGridTable.Add(MyGridData); //more then 2 datas
}

推 MyGridTable 2 或更多 MyGridData 以查找 MyGridData 找到的选定行。然后,xaml 端

<!--abstract... your GridData tag -->
<DataGrid SelectedItem="{Binding MyData}" ItemSource="{Binding MyGridTable}"/>
<!--And put Trigger Code ABOVE Reply-->

Lanch App 并双击DataGrid,然后可以在MyGridTable 选中的Row 中找到Correspond MyData。

于 2022-02-22T06:15:22.947 回答