2

WPF では、データグリッド行ヘッダーのトグル ボタンを使用して、各親データグリッド行の詳細な可視性を子データグリッドとして表示しています。トグル ボタンをクリックすると、対応する親データグリッド行の表示状態が「チェック済み」状態に変わります。正常に動作しています。しかし同時に、各トグルボタンをクリックせずに、他のすべての親データグリッド行の視覚状態を「未チェック」または「通常」として視覚状態にしたかったのです。次のコードを使用しています。しかし、それは正しく機能していません。しかし、各トグル ボタンをクリックすると、その表示状態が適切に変化しています。

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);
                }
            }}

また、試してみましたが、

 VisualStateManager.GoToState((obj as DataGridRow), "Checked", true);

お願い助けて。ありがとう。

4

3 に答える 3

2

の最初の列datagridをこれに設定します

 <DataGridTemplateColumn CellTemplate="{StaticResource ExpandDetails}" Width="30" />

dataTemplateこれをリソースに入れます

<DataTemplate x:Key="ExpandDetails">
            <ToggleButton Name="ShowDetails" Height="20"
                              IsChecked="{Binding RelativeSource={RelativeSource AncestorType=DataGridRow}, 
                                                  Path=DetailsVisibility, 
                                                  Converter={StaticResource VisbilityToBooleanConverter}, 
                                                  Mode=TwoWay}" 
                              Margin="4" HorizontalAlignment="Right" FlowDirection="LeftToRight" BorderThickness="0" />
</DataGridTemplateColumn>

次に、VisbilityToBooleanConverterこのように作成します

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;
    }
}
于 2015-01-20T08:16:56.207 に答える
0

Toggle Button IsCheckedの値を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;
}

ありがとうございます。

于 2015-01-21T04:31:04.070 に答える