C# WPF datagrid行标题切换按钮visualstate从代码隐藏更改
在WPF中,我使用datagrid行标题中的一个切换按钮来显示每个父datagrid行作为子datagrid的详细可见性。单击切换按钮时,相应父datagrid行的visualstate将更改为“已选中”状态。它工作正常。但同时,我想使所有其他父datagrid行的visualstate可视状态为“未选中”或“正常”,而无需单击每个切换按钮。我正在使用以下代码。但它不能正常工作。但如果我点击每个切换按钮,那么它的视觉状态会发生适当的变化C# WPF datagrid行标题切换按钮visualstate从代码隐藏更改,c#,wpf,datagrid,togglebutton,datagridrowheader,C#,Wpf,Datagrid,Togglebutton,Datagridrowheader,在WPF中,我使用datagrid行标题中的一个切换按钮来显示每个父datagrid行作为子datagrid的详细可见性。单击切换按钮时,相应父datagrid行的visualstate将更改为“已选中”状态。它工作正常。但同时,我想使所有其他父datagrid行的visualstate可视状态为“未选中”或“正常”,而无需单击每个切换按钮。我正在使用以下代码。但它不能正常工作。但如果我点击每个切换按钮,那么它的视觉状态会发生适当的变化 private void ToggleButton_Cli
private void ToggleButton_Click(object sender, RoutedEventArgs e)
{
DependencyObject obj = (DependencyObject)e.OriginalSource;
while (!(obj is DataGridRow) && (obj != null))
{
obj = VisualTreeHelper.GetParent(obj);
}
if (obj is DataGridRow)
{
if ((obj as DataGridRow).DetailsVisibility == Visibility.Visible)
{
(obj as DataGridRow).IsSelected = false;
(obj as DataGridRow).DetailsVisibility = System.Windows.Visibility.Collapsed;
}
else if ((obj as DataGridRow).DetailsVisibility == Visibility.Collapsed)
{
for (int i = 0; i < Data_Grid.Items.Count; i++)
{
DataGridRow itm = GetDataGridRowitem(i);
itm.IsSelected = false;
itm.DetailsVisibility = System.Windows.Visibility.Collapsed;
VisualStateManager.GoToElementState(itm, "Unchecked", true);
}
DataTemplate dt = FindResource("tocchild") as DataTemplate;
Data_Grid.RowDetailsTemplate = dt;
(obj as DataGridRow).IsSelected = true;
(obj as DataGridRow).DetailsVisibility = Visibility.Visible;
VisualStateManager.GoToElementState((obj as DataGridRow), "Checked", true);
}
}}
请帮帮我。
谢谢。将
数据网格的第一列设置为此
<DataGridTemplateColumn CellTemplate="{StaticResource ExpandDetails}" Width="30" />
然后像这样创建VisibilityToBooleanConverter
public class VisbilityToBooleanConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return (Visibility)value == Visibility.Visible;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return (bool)value ? Visibility.Visible : Visibility.Collapsed;
}
}
试试这个
class VisibilityConverter : IValueConverter
我通过将值切换按钮设置为True和false来解决这个问题
FrameworkElement tb = GetTemplateChildByName(row, "RowHeaderToggleButton");
(tb as ToggleButton).IsChecked = false;
GetTemplateChildByName所在的位置
public static FrameworkElement GetTemplateChildByName(DependencyObject parent, string name)
{
int childnum = VisualTreeHelper.GetChildrenCount(parent);
for (int i = 0; i < childnum; i++)
{
var child = VisualTreeHelper.GetChild(parent, i);
if (child is FrameworkElement &&
((FrameworkElement)child).Name == name)
{
return child as FrameworkElement;
}
else
{
var s = GetTemplateChildByName(child, name);
if (s != null)
return s;
}
}
return null;
}
公共静态FrameworkElement GetTemplateChildByName(DependencyObject父对象,字符串名称)
{
int childnum=VisualTreeHelper.GetChildrenCount(父级);
for(int i=0;i
谢谢大家
FrameworkElement tb = GetTemplateChildByName(row, "RowHeaderToggleButton");
(tb as ToggleButton).IsChecked = false;
public static FrameworkElement GetTemplateChildByName(DependencyObject parent, string name)
{
int childnum = VisualTreeHelper.GetChildrenCount(parent);
for (int i = 0; i < childnum; i++)
{
var child = VisualTreeHelper.GetChild(parent, i);
if (child is FrameworkElement &&
((FrameworkElement)child).Name == name)
{
return child as FrameworkElement;
}
else
{
var s = GetTemplateChildByName(child, name);
if (s != null)
return s;
}
}
return null;
}