我无法在树视图上绑定 IsExpanded 属性

I can't bind with the IsExpanded property on my treeview

我正在尝试绑定 IsExpanded 属性,但到目前为止还没有成功。我需要知道其中一个组何时展开。

 <TreeView Grid.Row="1">

            <!--  Encontrados  -->
            <TreeViewItem
                FontWeight="Bold"
                IsExpanded="True"
                ItemsSource="{Binding Banco.Grupos}">
                <TreeViewItem.Header>
                    <StackPanel Orientation="Horizontal">
                        <materialDesign:PackIcon
                            Width="20"
                            Foreground="Green"
                            Kind="Done" />
                        <TextBlock Text="ENCONTRADOS: " />
                        <TextBlock Text="{Binding SaldoEncontrados, StringFormat='{}{0:C}', ConverterCulture='PT-BR'}" />
                    </StackPanel>
                </TreeViewItem.Header>
                <TreeViewItem.ItemTemplate>
                    
                    <HierarchicalDataTemplate  DataType="{x:Type model:Grupo}" ItemsSource="{Binding Transações}">
                                                     
                        <StackPanel Orientation="Horizontal">                               
                            <TextBlock Text="{Binding Nome, StringFormat='{}{0}: '}" />
                            <TextBlock Text="{Binding ValorTotal, StringFormat='{}{0:C}', ConverterCulture='PT-BR'}" />
                        </StackPanel>

                        <HierarchicalDataTemplate.ItemTemplate>                                
                            <DataTemplate>                                    
                                <Grid>
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width="auto" />
                                        <ColumnDefinition Width="auto" />
                                        <ColumnDefinition Width="*" />
                                        <ColumnDefinition Width="auto" />
                                    </Grid.ColumnDefinitions>

                                    <CheckBox
                                        Grid.Column="0"
                                        FontWeight="Normal"
                                        IsChecked="{Binding isEnabled}" />

                                    <TextBlock
                                        Grid.Column="1"
                                        FontWeight="Normal"
                                        Text="{Binding Transação.DataDaTransação, StringFormat='dd/MM/yyyy'}" />

                                    <TextBlock
                                        Grid.Column="2"
                                        Margin="10,0,10,0"
                                        FontWeight="Normal"
                                        Text="{Binding Transação.Historico}" />

                                    <TextBlock
                                        Grid.Column="3"
                                        HorizontalAlignment="Right"
                                        FontWeight="Normal"
                                        Text="{Binding Transação.Valor, StringFormat='{}{0:C}', ConverterCulture='PT-BR'}" />
                                </Grid>
                            </DataTemplate>
                        </HierarchicalDataTemplate.ItemTemplate>
                    </HierarchicalDataTemplate>

                </TreeViewItem.ItemTemplate>
            </TreeViewItem>
            <!--  Não Encontrados  -->
            <TreeViewItem
                FontWeight="DemiBold"
                IsExpanded="False"
                ItemsSource="{Binding TransaçõesNãoEncontradas}">
                <TreeViewItem.Header>
                    <StackPanel HorizontalAlignment="Left" Orientation="Horizontal">
                        <materialDesign:PackIcon
                            Width="20"
                            Foreground="Red"
                            Kind="Error" />
                        <TextBlock Text="NÃO ENCONTRADOS: " />
                        <TextBlock Text="{Binding SaldoNaoEncontrados, StringFormat='{}{0:C}', ConverterCulture='PT-BR'}" />
                    </StackPanel>
                </TreeViewItem.Header>
                <TreeViewItem.ItemTemplate>
                    <DataTemplate>
                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="auto" />
                                <ColumnDefinition x:Name="Coluna1" Width="*" />
                                <ColumnDefinition Width="auto" />
                            </Grid.ColumnDefinitions>
                            <TextBlock
                                Grid.Column="0"
                                FontWeight="Normal"
                                Text="{Binding DataDaTransação, StringFormat='dd/MM/yyyy'}" />
                            <TextBlock
                                Grid.Column="1"
                                Margin="10,0,10,0"
                                FontWeight="Normal"
                                Text="{Binding Historico}" />
                            <TextBlock
                                Grid.Column="2"
                                HorizontalAlignment="Right"
                                FontWeight="Normal"
                                Text="{Binding Valor, StringFormat='{}{0:C}', ConverterCulture='PT-BR'}" />
                        </Grid>
                    </DataTemplate>
                </TreeViewItem.ItemTemplate>
            </TreeViewItem>
        </TreeView>

我的组class:

public class Grupo
{
   
    public int Id { get; set; }       
    public int BancoId { get; set; }
    public string Nome { get; set; }                
    public List<Transações> Transações { get; set; }      
    public decimal ValorTotal { get; set; }       
    public bool isExpanded { get; set; } = false;              
    public bool isZeroEnabled { get; set; }valores
}

public record Transações(int pk, int fk, bool isEnabled, OfxTransação Transação)
{
    public bool isEnabled { get; set; } = isEnabled;
}

XAML:

谁能帮我绑定 treeview 的 IsExpanded 属性 这样我就可以知道什么时候展开了“组”。

我创建了一个代码示例:https://github.com/Foiolag/TreeviewExample

项容器的 DataContext(在本例中为 TreeViewItem)始终是数据项本身。 考虑到这一点,您可以使用 Style:

设置绑定
<Style TargetType="TreeViewItem">
  <Setter Property="IsExpanded" 
          Value="{Binding IsExpanded, Mode=TwoWay}" />
</Style>

您可以通过 ItemContainerStyle 绑定 IsExpanded 属性。确保删除显式 IsExpanded="True"

<!--  Encontrados  -->
<TreeViewItem FontWeight="Bold"
              ItemsSource="{Binding Banco.Grupos}">
    <TreeViewItem.ItemContainerStyle>
      <Style TargetType="TreeViewItem">
        <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}"/>
      </Style>
    </TreeViewItem.ItemContainerStyle>

提示1:这个样式会被继承到所有children,应用程序也会尝试绑定到不存在的IsExpanded属性 在你的 Transações object 上。这不会抛出任何异常,只会抛出绑定错误。为了保持一致性,我宁愿在所有 children.

上实现 IsExpanded 属性

提示 2: 您的模型 classes 不是 bindable(不通知 属性 更改) .如果您在视图初始化后更改属性,视图将不会对您的更改作出反应。您必须实施 INotifyPropertyChanged 或使用像 BindableBase 这样的基础 class。阅读 。如果这些属性是供 read-only 使用的,最好将它们设为 read-only(删除 setter)。

提示 3:请避免在变量和 class 名称中使用特殊字符