如何在UWP RadDataGrid中实现行选中时动态显隐AppBarButton?
实现Telerik RadDataGrid行选中时显示按钮的方案
当然可以实现这个需求!核心思路是绑定按钮的Visibility到当前行的选中状态,配合布尔值转可见性的转换器就能轻松搞定,具体步骤如下:
1. 添加布尔转可见性转换器
首先在你的Page/UserControl的资源中添加内置的BooleanToVisibilityConverter,它会帮我们把bool类型的选中状态转换成Visibility枚举值:
<Page.Resources> <BooleanToVisibilityConverter x:Key="BoolToVisConverter" /> </Page.Resources>
2. 修改AppBarButton的Visibility绑定
在你的DataGridTemplateColumn的CellContentTemplate里,把AppBarButton的Visibility绑定到当前DataGridRow的IsSelected属性。这里需要用RelativeSource向上查找父级的DataGridRow元素:
<AppBarButton Grid.Column="1" Icon="Edit" Visibility="{Binding IsSelected, RelativeSource={RelativeSource AncestorType=telerikGrid:DataGridRow}, Converter={StaticResource BoolToVisConverter}}" />
原理说明
RelativeSource={RelativeSource AncestorType=telerikGrid:DataGridRow}:告诉XAML在可视化树中向上查找最近的DataGridRow元素,这个元素就是当前单元格所在的行。BooleanToVisibilityConverter:默认会把true(行选中)转换成Visibility.Visible,false(行未选中)转换成Visibility.Collapsed,完美匹配你的需求。
可选:基于ViewModel的扩展方案
如果你希望通过ViewModel来控制按钮显示(比如需要额外的业务逻辑判断),可以在MyViewModel中添加一个IsSelected属性:
public bool IsSelected { get; set; }
然后在RadDataGrid的SelectionChanged事件中同步选中行的IsSelected状态:
private void RadDataGrid_SelectionChanged(object sender, SelectionChangeEventArgs e) { // 先取消之前选中行的状态 foreach (var item in e.RemovedItems) { if (item is MyViewModel vm) vm.IsSelected = false; } // 设置新选中行的状态 foreach (var item in e.AddedItems) { if (item is MyViewModel vm) vm.IsSelected = true; } }
此时按钮的绑定就可以直接指向ViewModel的IsSelected属性:
<AppBarButton Grid.Column="1" Icon="Edit" Visibility="{Binding IsSelected, Converter={StaticResource BoolToVisConverter}}" />
推荐优先使用第一种方案,不需要修改ViewModel代码,更符合MVVM的轻量化原则。
内容的提问来源于stack exchange,提问作者ata6502
相关产品推荐
相关产品推荐

