C# 使用ToggleButton和附加属性更新ListBox项模板

C# 使用ToggleButton和附加属性更新ListBox项模板,c#,wpf,xaml,data-binding,C#,Wpf,Xaml,Data Binding,我想实现一个ListBox,当我按下ToggleButton时,应该更新ListBox的模板。模板一将只有图标,一将有图标和文本,如图所示 我已为此创建了一个附加属性,并将其绑定到控件模板内的切换按钮IsChecked属性,但此附加属性未更新,我的模板也未更改。 第一次加载应用程序时,它正在工作 <Style x:Key="NavigationListBoxStyle" TargetType="{x:Type ListBox}"> &l

我想实现一个
ListBox
,当我按下
ToggleButton
时,应该更新
ListBox
的模板。模板一将只有图标,一将有图标和文本,如图所示

我已为此创建了一个附加属性,并将其绑定到控件模板内的
切换按钮
IsChecked
属性,但此附加属性未更新,我的模板也未更改。 第一次加载应用程序时,它正在工作

<Style x:Key="NavigationListBoxStyle" TargetType="{x:Type ListBox}">
   <Setter Property="Background" Value="{StaticResource PrimaryDarkBrush}"/>
   <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Disabled"/>
   <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Disabled"/>
   <Setter Property="VerticalContentAlignment" Value="Center"/>
   <Setter Property="HorizontalContentAlignment" Value="Center"/>
   <Setter Property="SelectedIndex" Value="0"/>
   <Setter Property="Width" Value="Auto"/>

   <Setter Property="Template">
      <Setter.Value>
         <ControlTemplate TargetType="{x:Type ListBox}">
            <Border Background="{TemplateBinding Background}"
                                BorderThickness="0"
                                Padding="0"
                                SnapsToDevicePixels="true">
               <ScrollViewer Padding="{TemplateBinding Padding}"
                                          Focusable="false">
                  <StackPanel>
                     <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                     <ToggleButton IsChecked="{Binding local:IsOpenInfo.IsOpen,Mode=TwoWay}" Style="{DynamicResource ToggleButtonstyle}" Foreground="White">
                     </ToggleButton>
                  </StackPanel>
               </ScrollViewer>
            </Border>
         </ControlTemplate>
      </Setter.Value>
   </Setter>
   <Setter Property="ItemTemplate" Value="{DynamicResource NavigationDataTemplate}"/>
   <Style.Triggers>
      <Trigger Property="local:IsOpenInfo.IsOpen" Value="True">
         <Setter Property="ItemTemplate" Value="{DynamicResource NavigationDataTemplate1}"/>
      </Trigger>
      <Trigger Property="local:IsOpenInfo.IsOpen" Value="False">
         <Setter Property="ItemTemplate" Value="{DynamicResource NavigationDataTemplate}"/>
      </Trigger>
   </Style.Triggers>
</Style>

<Style x:Key="ToggleButtonstyle" TargetType="{x:Type ToggleButton}">
   <Setter Property="Template">
      <Setter.Value>
         <ControlTemplate TargetType="{x:Type ToggleButton}">
            <StackPanel Orientation="Horizontal">
               <iconPacks:PackIconMaterialDesign x:Name="MenuItemIcon" VerticalAlignment="Center" 
                                              HorizontalAlignment="Center" Margin="12" Kind="ArrowBack"/>
               <TextBlock Text="Collapse" VerticalAlignment="Center"  HorizontalAlignment="Center" />
            </StackPanel>
            <ControlTemplate.Triggers>
               <Trigger Property="IsChecked" Value="true">
                  <Setter TargetName="MenuItemIcon" Property="Kind" Value="ArrowForward"/>
                  <Setter TargetName="txtBlock" Property="Visibility" Value="Collapsed"/>
               </Trigger>
               <Trigger Property="IsChecked" Value="false">
                  <Setter TargetName="MenuItemIcon" Property="Kind" Value="ArrowBack"/>
                  <Setter TargetName="txtBlock" Property="Visibility" Value="Visible"/>
               </Trigger>
            </ControlTemplate.Triggers>
         </ControlTemplate>
      </Setter.Value>
   </Setter>
</Style>

<DataTemplate x:Key="NavigationDataTemplate">
   <iconPacks:PackIconMaterialDesign x:Name="MenuItemIcon" VerticalAlignment="Center" 
                                              HorizontalAlignment="Center" Margin="12"/>

   <DataTemplate.Triggers>
      <DataTrigger Binding="{Binding}" Value="Home">
         <Setter TargetName="MenuItemIcon" Property="Kind" Value="Home"/>
      </DataTrigger>
      <DataTrigger Binding="{Binding}" Value="Email">
         <Setter TargetName="MenuItemIcon" Property="Kind" Value="Email"/>
      </DataTrigger>
      <DataTrigger Binding="{Binding}" Value="Cloud">
         <Setter TargetName="MenuItemIcon" Property="Kind" Value="Cloud"/>
      </DataTrigger>
      <DataTrigger Binding="{Binding}" Value="Collapse">
         <Setter TargetName="MenuItemIcon" Property="Kind" Value="Mail"/>
      </DataTrigger>
   </DataTemplate.Triggers>
</DataTemplate>

<DataTemplate x:Key="NavigationDataTemplate1">
   <StackPanel Orientation="Horizontal">
      <iconPacks:PackIconMaterialDesign x:Name="MenuItemIcon" VerticalAlignment="Center" 
                                              HorizontalAlignment="Center" Margin="12"/>
      <TextBlock Text="{Binding}"  HorizontalAlignment="Center" VerticalAlignment="Center"/>
   </StackPanel>
   <DataTemplate.Triggers>
      <DataTrigger Binding="{Binding}" Value="Home">
         <Setter TargetName="MenuItemIcon" Property="Kind" Value="Home"/>
      </DataTrigger>
      <DataTrigger Binding="{Binding}" Value="Email">
         <Setter TargetName="MenuItemIcon" Property="Kind" Value="Email"/>
      </DataTrigger>
      <DataTrigger Binding="{Binding}" Value="Cloud">
         <Setter TargetName="MenuItemIcon" Property="Kind" Value="Cloud"/>
      </DataTrigger>
   </DataTemplate.Triggers>
</DataTemplate>
我不明白为什么在检查
属性时附加属性不更新,并且样式触发器不工作?
有什么简单的方法可以做到这一点吗


有人告诉我如何处理这种情况吗?

您的样式定义为
TargetType
设置为
ListBox
,触发器将解析应用样式的
ListBox
实例的自定义
local:IsOpenInfo.IsOpen
属性的值

但是,
切换按钮
是在
列表框的
控制模板
中定义的。其
IsChecked
绑定不会自动设置其模板化父控件上附加属性的值。它将在
切换按钮
本身上设置。实际上,您在
切换按钮上设置值,但在样式中的
列表框上检查值,因此您在不同的值上操作

您可以通过显式绑定到
TemplatedParent
,这是一个
ListBox
实例,使其工作。样式和切换按钮都将解析同一
ListBox
实例的附加属性值

<ToggleButton IsChecked="{Binding (local:IsOpenInfo.IsOpen), RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}"
              Style="{DynamicResource ToggleButtonstyle}"
              Foreground="White"/>


Hi,是否可以使切换按钮的行为也与listitem类似,因为只有当我按下图像时,切换才起作用,如果我在蓝色背景上按下,则切换不会被切换为listitemexpected@NAGASREE
ToggelButton
没有背景,因此,在控制模板中,将
堆栈面板的
背景设置为
透明应起作用:
。如果您想要与列表框项目相同的按钮效果,则必须相应地调整
ToggleButton
的控制模板。非常感谢
<ToggleButton IsChecked="{Binding (local:IsOpenInfo.IsOpen), RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}"
              Style="{DynamicResource ToggleButtonstyle}"
              Foreground="White"/>