Переключение между DataGrids CellTemplate и EditingCellTemplate при нажатии кнопки внутри EditingCellTemplate - PullRequest
1 голос
/ 19 июня 2019

Я использую DataGrid, и при нажатии кнопки я хочу иметь возможность переключаться между CellTemplate и EditingCellTemplate столбца DataGrid.

ПоказываетDataGrid 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 ]

1 голос
/ 19 июня 2019

Благодаря @ 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);
        }
    }
1 голос
/ 19 июня 2019

Если вы хотите выйти из режима редактирования при нажатии Button, вы можете подключить обработчик событий Click, который вызывает метод CancelEdit() для DataGrid. Здесь , как это сделать в ResourceDictionary.

private void Button_Click(object sender, RoutedEventArgs e)
{
    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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...