单击EditingCellTemplate内的按钮,在DataGrids CellTemplate和EditingCellTemplate之间切换

时间:2019-06-19 12:43:50

标签: c# .net wpf datagrid

我正在使用DataGrid,并单击按钮,希望能够在CellTemplate列的EditingCellTemplateDataGrid之间进行切换。

显示数据网格 enter image description here

在加载时,DataGrid显示具有权限级别的CellTemplate

当用户在权限级别单元格中双击时,模板将更改为EditingCellTemplate,并显示一个ItemsControl按钮。

显示按钮 enter image description here

当用户按下Admin,Read或Write这些按钮之一时,我希望权限级别模板显示CellTemplate仅显示文本,而不显示EditingCellTemplate。 我已经考虑过使用一种行为,但是不确定它如何工作。我的两个CellTemplates都在资源字典中。

显示文本的CellTemplate

<DataTemplate x:Key="PermissionTemplate">
    <Border>
        <Label  Content="{Binding Path=PermissionLevel.Access}" />
    </Border>
</DataTemplate>

编辑单元格模板

<DataTemplate x:Key="EditingPermissionTemplate">
    <Border>
        <UniformGrid Rows="1" Columns="1">
                <ItemsControl ItemsSource="{Binding RelativeSource={RelativeSource AncestorType=UserControl, Mode=FindAncestor}, Path=DataContext.AllPermissionLevels}" HorizontalContentAlignment="Stretch">
                    <ItemsControl.ItemTemplate>
                        <DataTemplate>
                            <StackPanel>
                                <Button Style="{StaticResource BaseButtonStyle}"
                                    Command="{Binding RelativeSource={RelativeSource AncestorType=UserControl, Mode=FindAncestor}, Path=DataContext.UpdatePermissionCommand}"
                                        CommandParameter="{Binding}" >
                                    <TextBlock TextWrapping="Wrap" Text="{Binding Path=Access}" />
                                </Button>
                            </StackPanel>
                        </DataTemplate>
                    </ItemsControl.ItemTemplate>
                </ItemsControl>
        </UniformGrid>
    </Border>
</DataTemplate>

DataGrid

<DataGrid ItemsSource="{Binding Path=AllUsersModules}" SelectedItem="{Binding Path=SelectedUsersModule}" 
                      Style="{StaticResource BaseDataGridStyle}" SelectionUnit="FullRow">
                <DataGrid.CellStyle>
                    <Style TargetType="{x:Type DataGridCell}">
                        <Setter Property="Background" Value="{StaticResource WhiteColorBrush}" />
                        <Setter Property="Foreground" Value="Black" />
                        <Style.Triggers>
                            <Trigger Property="IsSelected" Value="True">
                                <Setter Property="Background" Value="Transparent" />
                                <Setter Property="BorderBrush" Value="Orange" />
                            </Trigger>
                        </Style.Triggers>
                    </Style>
                </DataGrid.CellStyle>

                <DataGrid.Columns>
                    <DataGridTemplateColumn Header="Module" HeaderStyle="{StaticResource DataGridColumnHeaderStyle}" Width="*" 
                                            CellTemplate="{StaticResource ModuleTemplate}"/>
                    <DataGridTemplateColumn Header="Permission Level" HeaderStyle="{StaticResource DataGridColumnHeaderStyle}" Width="*" 
                                            CellTemplate="{StaticResource PermissionTemplate}" 
                                            CellEditingTemplate="{StaticResource EditingPermissionTemplate}"/>
                </DataGrid.Columns>
            </DataGrid>

2 个答案:

答案 0 :(得分:1)

如果要在单击Button时退出编辑模式,则可以挂接一个Click事件处理程序,该事件处理程序调用{​​{1}}的{​​{1}}方法。 HereCancelEdit()中的操作方法。

DataGrid

答案 1 :(得分:1)

由于@ mm8,我创建了一个行为以附加到我的按钮以关闭编辑模板。

public static class SwitchCellTemplate
    {
        /// <summary>
        /// Attached property to buttons to close host window
        /// </summary>
        public static readonly DependencyProperty SwitchTemplate =
            DependencyProperty.RegisterAttached
            (
                "CloseTemplate",
                typeof(bool),
                typeof(SwitchCellTemplate),
                new PropertyMetadata(false, SwithcTemplateChanged)
            );

        public static bool GetSwitchTemplateProperty(DependencyObject obj)
        {
            return (bool)obj.GetValue(SwitchTemplate);
        }

        public static void SetSwitchTemplateProperty(DependencyObject obj, bool value)
        {
            obj.SetValue(SwitchTemplate, value);
        }


        public static void SwithcTemplateChanged(DependencyObject property, DependencyPropertyChangedEventArgs args)
        {
            if (property is Button)
            {
                Button button = property as Button;
                if (button != null) button.Click += OnClick;
            }

        }

        private static void OnClick(object sender, RoutedEventArgs e)
        {
            if (sender is Button)
            {
                DataGrid dataGrid = FindParent<DataGrid>((Button)sender);
                if (dataGrid != null)
                    dataGrid.CancelEdit();
            }
        }

        private static T FindParent<T>(DependencyObject dependencyObject) where T : DependencyObject
        {
            var parent = VisualTreeHelper.GetParent(dependencyObject);

            if (parent == null) return null;

            var parentT = parent as T;
            return parentT ?? FindParent<T>(parent);
        }
    }