弹出以编辑数据网格的复杂属性

时间:2019-04-15 07:33:45

标签: wpf datagrid

我正在开发使用数据网格显示对象列表的WPF应用程序。一些列显示的属性具有更深的信息,我想在数据网格中显示摘要值,然后在单击以允许编辑属性时显示更深的窗口。

我是我想要的一部分,因为我的数据网格显示了我想要的,并且当我单击其中的特殊列之一时,可以显示一个对话框。

<DataGrid ItemsSource="{Binding Sequence.Steps}" AutoGenerateColumns="False" IsReadOnly="True" SelectionUnit="Cell">
    <DataGrid.Resources>
        <Style TargetType="DataGridCell">
            <EventSetter Event="PreviewMouseDown" Handler="DataGrid_PreviewMouseDown" />
            <Setter Property="Focusable" Value="False" />
        </Style>
    </DataGrid.Resources>
    <DataGrid.Columns>
        <DataGridTextColumn Header="Axis 1" Binding="{Binding Axes[0]}" ClipboardContentBinding="{Binding Axes[0].DestinationSP}" Width="*" />
        <DataGridTextColumn Header="Axis 2" Binding="{Binding Axes[1]}" ClipboardContentBinding="{Binding Axes[1].DestinationSP}" Width="*"/>
        <DataGridTextColumn Header="Axis 3" Binding="{Binding Axes[2]}" ClipboardContentBinding="{Binding Axes[2].DestinationSP}" Width="*"/>
    </DataGrid.Columns>
</DataGrid>

然后我定义了一个处理程序

private void DataGrid_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
    var dlg = new Views.EditAxisMovement(CellValue); // Need to find a way to get Cell value so I can pass it
    dlg.Owner = this;
    dlg.ShowDialog();
}

但是,我找不到找到CellValue并传递到对话框的正确方法。有没有更好和/或更好的方法来处理此问题。

2 个答案:

答案 0 :(得分:0)

DataGridCellInfo只是适合您的情况。

var dlg = new Views.EditAxisMovement(new DataGridCellInfo((DataGridCell)sender).Item); // Need to find a way to get Cell value so I can pass it

答案 1 :(得分:0)

您可以创建一个DataGridCellInfo并检查列的标题以将单元格映射到数据项的属性,例如:

private void DataGrid_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
    DataGridCell cell = (DataGridCell)sender;
    DataGridCellInfo cellInfo = new DataGridCellInfo(cell);
    string header = cellInfo.Column.Header?.ToString();
    int index = -1;
    switch (header)
    {
        case "Axis 1":
            index = 0;
            break;
        case "Axis 2":
            index = 1;
            break;
        case "Axis 3":
            index = 2;
            break;
    }
    if (index != -1)
    {

    }

    var dataItem = cellInfo.Item as YourClass;
    object value = dataItem.Axes[index];
    //...
}