我正在使用DataGrid
,并单击按钮,希望能够在CellTemplate
列的EditingCellTemplate
和DataGrid
之间进行切换。
在加载时,DataGrid
显示具有权限级别的CellTemplate
。
当用户在权限级别单元格中双击时,模板将更改为EditingCellTemplate
,并显示一个ItemsControl
按钮。
当用户按下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>
答案 0 :(得分:1)
如果要在单击Button
时退出编辑模式,则可以挂接一个Click
事件处理程序,该事件处理程序调用{{1}}的{{1}}方法。 Here是CancelEdit()
中的操作方法。
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);
}
}