WPF Datagrid双击单元MVVM设计

时间:2013-09-03 15:06:44

标签: c# wpf xaml mvvm datagrid

我有一个包含数据网格的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
}

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

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

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

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

任何帮助都会很棒, 谢谢, 中号

4 个答案:

答案 0 :(得分:23)

您可以双击网格

,而不是双击单元格
    <DataGrid.InputBindings>
        <MouseBinding Gesture="LeftDoubleClick" Command="{Binding Edit}" CommandParameter="{Binding ElementName=UsersDataGrid, Path=SelectedItem}" />
    </DataGrid.InputBindings>

在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);
    }

答案 1 :(得分: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);
        }
    }
}

答案 2 :(得分:1)

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

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>

那就是它。希望它可以帮助你:)

答案 3 :(得分: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);
            }
        }
    }

当您双击数据网格时,该行也会被选中,因此我只需找到所选项目并使用它。