WPF DataGridTemplateColumn中根据Admin身份隐藏指定按钮的实现方案咨询
WPF DataGridTemplateColumn中根据Admin身份隐藏指定按钮的实现方案咨询
嗨,我来给你几个实用的方案,都是WPF里常用的实现思路,你可以根据自己的项目情况选一个试试:
方案一:数据绑定+值转换器(推荐MVVM场景)
首先你需要把standingStatus.Text这个状态放到可绑定的属性里(比如ViewModel的UserRole属性),然后写一个值转换器,把角色转换成对应的Visibility:public class RoleToVisibilityConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { var role = value as string; // 如果是ADMIN,返回Collapsed隐藏按钮;否则Visible显示 return role == "ADMIN" ? Visibility.Collapsed : Visibility.Visible; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } }然后在XAML里引用这个转换器,给前三个按钮绑定Visibility:
先在资源里声明转换器:<Window.Resources> <local:RoleToVisibilityConverter x:Key="RoleToVisibilityConverter"/> </Window.Resources>然后修改按钮的Visibility属性:
<Button Style="{StaticResource gridInfButton}" x:Name="infButton" Visibility="{Binding DataContext.UserRole, RelativeSource={RelativeSource AncestorType=DataGrid}, Converter={StaticResource RoleToVisibilityConverter}}"> <Icon:PackIconMaterial Kind="Information" Style="{StaticResource gridButtonIcon}"/> </Button> <Button Style="{StaticResource gridPlayButton}" x:Name="playButton" Visibility="{Binding DataContext.UserRole, RelativeSource={RelativeSource AncestorType=DataGrid}, Converter={StaticResource RoleToVisibilityConverter}}"> <Icon:PackIconMaterial Kind="PlayOutline" Style="{StaticResource gridButtonIcon}"/> </Button> <Button Style="{StaticResource gridEditButton}" Margin="5 0 0 0" x:Name="editButton" Visibility="{Binding DataContext.UserRole, RelativeSource={RelativeSource AncestorType=DataGrid}, Converter={StaticResource RoleToVisibilityConverter}}"> <Icon:PackIconMaterial Kind="PencilOutline" Style="{StaticResource gridButtonIcon}"/> </Button>这样当
UserRole是"ADMIN"时,这三个按钮就会自动隐藏啦。方案二:后台代码通过LoadingRow事件控制
如果你的项目没有用MVVM,也可以直接在后台代码里处理。给DataGrid添加LoadingRow事件:<DataGrid x:Name="yourDataGrid" LoadingRow="YourDataGrid_LoadingRow"> <!-- 你的DataGrid内容 --> </DataGrid>然后在CS文件里写事件处理逻辑:
private void YourDataGrid_LoadingRow(object sender, DataGridRowEventArgs e) { if (standingStatus.Text == "ADMIN") { // 找到行里的三个按钮 var infButton = e.Row.FindName("infButton") as Button; var playButton = e.Row.FindName("playButton") as Button; var editButton = e.Row.FindName("editButton") as Button; if (infButton != null) infButton.Visibility = Visibility.Collapsed; if (playButton != null) playButton.Visibility = Visibility.Collapsed; if (editButton != null) editButton.Visibility = Visibility.Collapsed; } }注意:如果DataGrid有分页或者刷新数据的情况,这个事件会重新触发,状态会自动更新。
方案三:使用XAML样式触发器
你也可以直接在XAML里用触发器来实现,不需要后台代码。同样需要把角色状态绑定到DataGrid的DataContext或者当前窗口的DataContext:<Button x:Name="infButton"> <Button.Style> <Style BasedOn="{StaticResource gridInfButton}" TargetType="Button"> <Style.Triggers> <DataTrigger Binding="{Binding DataContext.UserRole, RelativeSource={RelativeSource AncestorType=DataGrid}}" Value="ADMIN"> <Setter Property="Visibility" Value="Collapsed"/> </DataTrigger> </Style.Triggers> </Style> </Button.Style> <Icon:PackIconMaterial Kind="Information" Style="{StaticResource gridButtonIcon}"/> </Button>另外两个按钮也用同样的样式触发器就可以了,这样XAML里就能直接控制显示隐藏。
备注:内容来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

