简体   繁体   English

wpf datagrid expand all 不工作

[英]wpf datagrid expand all not working

Hi have a Datagrid with groups, i added a button to Expand All groups but it's not working, all groups stay collapsed.嗨,有一个带有组的 Datagrid,我添加了一个按钮来展开所有组,但它不起作用,所有组都保持折叠状态。

I'm using PropertyChanged event Handler and a button with a Command我正在使用 PropertyChanged 事件处理程序和一个带有命令的按钮

Here is the xaml:这是xaml:

        <StackPanel Grid.Row="0">
        <Button x:Name="ExpandAll"  Content="Tout deplier" VerticalAlignment="Bottom" Command="{Binding ExpandAll}"/>
        <!-- This textblock text is updated by the Expanded property changed -->
        <TextBlock Text="{Binding Expanded}" />
    </StackPanel>
    <DataGrid x:Name="GrdLignes" HorizontalAlignment="Stretch" VerticalContentAlignment="Stretch" Margin="0,0,0,0"
              Grid.Row="1" VerticalAlignment="Top" AutoGenerateColumns="False" CanUserAddRows="False"
              CanUserDeleteRows="False" ItemsSource="{Binding Lignes}" IsReadOnly="True"
              RowDetailsVisibilityMode="VisibleWhenSelected" RowHeaderWidth="25">
        <DataGrid.GroupStyle>
            <GroupStyle>
                <GroupStyle.ContainerStyle>
                    <Style TargetType="{x:Type GroupItem}">
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate TargetType="{x:Type GroupItem}">
                                    <Expander Background="Lavender" IsExpanded="{Binding Expanded}">
                                        <Expander.Header>
                                            <StackPanel Orientation="Horizontal">
                                                <TextBlock Text="{Binding Path=Name}" Padding="0,0,5,0" FontWeight="Bold" />
                                                <TextBlock Text="{Binding Path=ItemCount}" Padding="0,0,5,0"/>
                                                <TextBlock Text="Commandes"/>
                                            </StackPanel>
                                        </Expander.Header>
                                        <ItemsPresenter />
                                    </Expander>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </GroupStyle.ContainerStyle>
            </GroupStyle>
        </DataGrid.GroupStyle>
        <DataGrid.Columns>
            <DataGridTextColumn Header="Pièce Achat" Binding="{Binding Path=Piece}" FontWeight="Bold"/>
            <DataGridTextColumn Header="Type" Binding="{Binding Path=TypeLabel}">
                <DataGridTextColumn.ElementStyle>
                    <Style TargetType="{x:Type TextBlock}">
                        <Setter Property="Background" Value="{Binding Path=Type, Converter={StaticResource TypeToBrushConverter}}" />
                    </Style>
                </DataGridTextColumn.ElementStyle>
            </DataGridTextColumn>
            <DataGridTextColumn Header="Statut" Binding="{Binding Path=StatutLabel}">
                <DataGridTextColumn.ElementStyle>
                    <Style TargetType="{x:Type TextBlock}">
                        <Setter Property="Background" Value="{Binding Path=Statut, Converter={StaticResource StatutToBrushConverter}}" />
                    </Style>
                </DataGridTextColumn.ElementStyle>
            </DataGridTextColumn>

        </DataGrid.Columns>
        <DataGrid.RowDetailsTemplate>
            <DataTemplate>
                <DataGrid RowHeaderWidth="25" ItemsSource="{Binding Path=Lignes}" AutoGenerateColumns="False" Margin="0" CanUserAddRows="False" CanUserDeleteRows="False" IsReadOnly="True">
                    <DataGrid.Columns>
                        <DataGridTextColumn Header="Acheteur" Binding="{Binding Path=Acheteur}"/>
                        <DataGridTextColumn Header="Pièce" Binding="{Binding Path=Piece}"/>
                        <DataGridTextColumn Header="Client" Binding="{Binding Path=Client}"/>
                        <DataGridTextColumn Header="Ref" Binding="{Binding Path=ArRef}"/>
                        <DataGridTextColumn Header="Ref Fourn" Binding="{Binding Path=RefFourn}"/>
                        <DataGridTextColumn Header="Designation" Binding="{Binding Path=Designation}"/>
                        <DataGridTextColumn Header="Qte" Binding="{Binding Path=CmQte}"/>
                        <DataGridTextColumn Header="Vendeur" Binding="{Binding Path=Vendeur}"/>
                    </DataGrid.Columns>
                </DataGrid>
            </DataTemplate>
        </DataGrid.RowDetailsTemplate>
    </DataGrid>

Here is the viewModel:这是视图模型:

public class MainViewModel : INotifyPropertyChanged
{
    private bool _expanded = false;

    public bool Expanded
    {
        get { return _expanded; }
        set
        {
            _expanded = value;
            OnPropertyChanged("Expanded");
        }
    }

    public ICommand ExpandAll { get; set; }

    public MainViewModel()
    {
        ExpandAll = new Command(ExpandAllAction);
    }

    private void ExpandAllAction(object parameters)
    {
        Expanded = true;
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

I think you need to set the UpdateSource Trigger to "PropertyChanged" when binding to the Expanded Property.我认为您需要在绑定到扩展属性时将 UpdateSource 触发器设置为“PropertyChanged”。

    <Expander Background="Lavender" IsExpanded="{Binding Expanded, UpdateSourceTrigger=PropertyChanged}">
                                    <Expander.Header>
                                        <StackPanel Orientation="Horizontal">
                                            <TextBlock Text="{Binding Path=Name}" Padding="0,0,5,0" FontWeight="Bold" />
                                            <TextBlock Text="{Binding Path=ItemCount}" Padding="0,0,5,0"/>
                                            <TextBlock Text="Commandes"/>
                                        </StackPanel>
                                    </Expander.Header>
                                    <ItemsPresenter />
                                </Expander>

I found a solution from this thread: https://stackoverflow.com/a/12611779/3182178我从这个线程中找到了一个解决方案: https : //stackoverflow.com/a/12611779/3182178

I added in MainWindow class this code:我在 MainWindow 类中添加了这段代码:

    public static class VisualTreeHelper
    {
        public static Collection<T> GetVisualChildren<T>(DependencyObject current) where T : DependencyObject
        {
            if (current == null)
                return null;

            var children = new Collection<T>();
            GetVisualChildren(current, children);
            return children;
        }
        private static void GetVisualChildren<T>(DependencyObject current, Collection<T> children) where T : DependencyObject
        {
            if (current != null)
            {
                if (current.GetType() == typeof(T))
                    children.Add((T)current);

                for (int i = 0; i < System.Windows.Media.VisualTreeHelper.GetChildrenCount(current); i++)
                {
                    GetVisualChildren(System.Windows.Media.VisualTreeHelper.GetChild(current, i), children);
                }
            }
        }
    }

    private void ExpandAll_OnClick(object sender, RoutedEventArgs e)
    {
        Collection<Expander> collection = VisualTreeHelper.GetVisualChildren<Expander>(GrdLignes);

        foreach (Expander expander in collection)
            expander.IsExpanded = true;
    }

    private void CollapseAll_OnClick(object sender, RoutedEventArgs e)
    {
        Collection<Expander> collection = VisualTreeHelper.GetVisualChildren<Expander>(GrdLignes);

        foreach (Expander expander in collection)
            expander.IsExpanded = false;
    }

Then inside the xaml i added two button with this code:然后在 xaml 中,我使用以下代码添加了两个按钮:

<Button Name="ExpandAll"  Content="++" VerticalAlignment="Bottom" Width="30" Click="ExpandAll_OnClick"/>
<Button Name="CollapseAll"  Content="--" VerticalAlignment="Bottom" Width="30" Margin="0" Click="CollapseAll_OnClick"/>

It's not the best but it's working...这不是最好的,但它正在工作......

Using one-way binding to set all groups open or close after a button click command.使用单向绑定设置在按钮单击命令后打开或关闭所有组。

View看法

<UserControl.Resources>
   <local:BindingProxy x:Key="proxy" Data="{Binding}" />
</UserControl.Resources>
<!-- grid code -->
<Expander IsExpanded="{Binding Source={StaticResource proxy}, Path=Data.Expanded, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}">

ViewModel视图模型

   public bool Expanded
      {
         get { return _expanded; }
         set { _expanded = value; OnPropertyChanged(); }
      }

Proxy代理人

public class BindingProxy : Freezable
{
    #region Overrides of Freezable

    protected override Freezable CreateInstanceCore()
    {
        return new BindingProxy();
    }

    #endregion

    public object Data
    {
        get { return GetValue(DataProperty); }
        set { SetValue(DataProperty, value); }
    }

    // Using a DependencyProperty as the backing store for Data.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty DataProperty = DependencyProperty.Register("Data", typeof(object), typeof(BindingProxy), new UIPropertyMetadata(null));
}

It's because the binding is done on the group, not on the main model.这是因为绑定是在组上完成的,而不是在主模型上。 Replace your XAML code by:将您的 XAML 代码替换为:

<Expander IsExpanded="{Binding Path=DataContext.IsExpanded, Mode=OneWay,
          RelativeSource={RelativeSource AncestorType={x:Type Window}}}">

Note the one way mode: when the user expands or collapses the groups, you don't want to push back the change to your model.请注意单向模式:当用户展开或折叠组时,您不希望将更改推回您的模型。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM