RadGridView 中的 RadButton 控件,其功能与切换按钮相同(打开嵌套网格)。
<telerik:RadButton x:Name="expand" Width="20" Content="+" Tag="{Binding Mode=OneWay}" Click="btnExpand_Click" />
“ btnExpand_Click ”功能
private void btnExpand_Click(object sender, RoutedEventArgs e)
{
RadButton btn = sender as RadButton;
if (btn.Content.Equals("+") && flagRowSelected == true)
{
flagRowSelected = false;
if (signButton != null)
{
signButton.Content = "+";
}
btn.Content = "-";
grd.RowDetailsVisibilityMode = Telerik.Windows.Controls.GridView.GridViewRowDetailsVisibilityMode.VisibleWhenSelected;
}
else
{
flagRowSelected = true;
btn.Content = "+";
grd.RowDetailsVisibilityMode = Telerik.Windows.Controls.GridView.GridViewRowDetailsVisibilityMode.Collapsed;
}
signButton = btn;
}
我在这里遇到两个问题。
1)我明确选择任何一行,然后点击“+”按钮。此代码工作正常,其嵌套网格变为可见,但按钮内容不会更改为“ - ”。
2)如果我没有明确选择任何行,请点击“+”按钮。此代码不起作用,其嵌套网格不可见。
任何形式的帮助都将受到赞赏。
答案 0 :(得分:1)
我可以看到代码的几个问题,不知道从哪里开始。让我们从signButton开始:你将它设置为最后一个语句(并且在某一点甚至之前设置了它的内容),但你再也不会读它了。因此,使用signButton毫无意义。如果你需要存储RowDetails是否扩展,为什么不使用bool?
第二:你将rowDetailsVisibility设置为VisibleWhenSelected
,因此当没有选择行时,按钮上的点击不会显示rowDetails。
第三:为什么你甚至首先使用RadButton?您需要一个具有两种不同状态的按钮,因此ToggleButton
似乎是自然的选择。
从你显示的xaml行我说你为网格提供某种自定义模板,也许是一个行模板,所以我假设你可以自由地使用RowDetails扩展器按钮的任何控件?
好吧,使用ToggleButton可能没有什么好处,不确定。
我改变了你的代码,也许你看看这个并尝试一下:
private void btnExpand_Click(object sender, RoutedEventArgs e)
{
ButtonBase btn = sender as ButtonBase;
if (btn.Content.Equals("+"))
{
btn.Content = "-";
grd.RowDetailsVisibilityMode =
GridViewRowDetailsVisibilityMode.VisibleWhenSelected;
var correspondingRow = btn.GetAncestor<GridRow>();
correspondingRow.Selected = true;
}
else
{
btn.Content = "+";
grd.RowDetailsVisibilityMode = GridViewRowDetailsVisibilityMode.Collapsed;
}
}
寻找某种类型的祖先:
public static class ControlExtensions
{
public static TAncestor GetAncestor<TAncestor>( this DependencyObject subElement )
where TAncestor : DependencyObject
{
return subElement.GetAncestor<TAncestor>( potentialAncestorToStopTheSearch: null );
}
public static TAncestor GetAncestor<TAncestor>( this DependencyObject subElement, UIElement potentialAncestorToStopTheSearch )
where TAncestor : DependencyObject
{
DependencyObject parent;
for (DependencyObject subControl = subElement; subControl != null; subControl = parent)
{
if (subControl is TAncestor) return (TAncestor) subControl;
if (object.ReferenceEquals( subControl, potentialAncestorToStopTheSearch )) return null;
parent = VisualTreeHelper.GetParent( subControl );
if (parent == null)
{
FrameworkElement element = subControl as FrameworkElement;
if (element != null)
{
parent = element.Parent;
}
}
}
return null;
}
}