【问题标题】:DataTrigger not changing template in ItemContainerStyle for ListboxDataTrigger 未更改 Listbox 的 ItemContainerStyle 中的模板
【发布时间】:2013-10-10 13:03:37
【问题描述】:

我的想法是在单击 MouseOver 或 Button 等时更改 ListboxItem 的外观。

<ListBox Name="listbox"
         Height="250"
         Grid.Row="4"
         Grid.ColumnSpan="5"
         HorizontalAlignment="Center">
  <ListBox.ItemContainerStyle>
    <Style TargetType="ListBoxItem">
      <Style.Triggers>
        <Trigger Property="IsMouseOver"
                 Value="True">
          <Setter Property="Template"
                  Value="{StaticResource control_mouseover}" />
        </Trigger>
        <Trigger Property="IsMouseOver"
                 Value="False">
          <Setter Property="Template"
                  Value="{StaticResource control_not_mouseover}" />
        </Trigger>
        <DataTrigger Binding="{Binding ElementName=grid.Artykuły, Path=IsPressed}"
                     Value="True">
          <Setter Property="Template"
                  Value="{StaticResource control_mouseover}" />
        </DataTrigger>
      </Style.Triggers>
    </Style>
  </ListBox.ItemContainerStyle>
</ListBox>

仅对事件 IsMouseOver 有效,但 DataTrigger 似乎无效 你知道为什么吗?

<ControlTemplate x:Key="control_not_mouseover"
                 TargetType="ListBoxItem">
  <Border BorderBrush="Transparent">
    <ContentPresenter x:Name="contentPresenter"
                      Content="{TemplateBinding Content}"
                      ContentTemplate="{StaticResource not_mouseover}"
                      HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                      Margin="{TemplateBinding Padding}" />
  </Border>
</ControlTemplate>
<ControlTemplate x:Key="control_mouseover"
                 TargetType="ListBoxItem">
  <ContentPresenter x:Name="contentPresenter"
                    Content="{TemplateBinding Content}"
                    ContentTemplate="{StaticResource mouseover}"
                    HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                    Margin="{TemplateBinding Padding}" />
</ControlTemplate>
<StackPanel>
  <Grid Name="grid"
        Height="240">
    <Button  Name="Artykuły"
             Grid.Column="0"
             Content="{Binding Path=liczba_wpisow, Converter={StaticResource wpisy_converter}}" /> [...]
  </Grid>
  <Listbox... />
</StackPanel>

【问题讨论】:

  • 什么是 grid.Artykuły?它在哪里?
  • 我更新了。 Grid 和 Listbox 都在 StackPanel 中,看一个问题的结尾。
  • 抱歉,DataTrigger 根本不工作,这就是问题所在。
  • 您是否尝试仅使用 Binding="{Binding ElementName=Artykuły, 而不是 gird.Artykuly?

标签: wpf xaml listbox itemcontainerstyle


【解决方案1】:

我发现您的代码存在许多问题。第一个是您不需要为true false 条件添加Trigger。相反,您应该这样做:

<ListBox Name="listbox" Height="250" Grid.Row="4" Grid.ColumnSpan="5" HorizontalAlignment="Center">
    <ListBox.ItemContainerStyle>
        <Style TargetType="ListBoxItem">
            <Setter Property="Template" Value="{StaticResource control_not_mouseover}"/>
            <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter Property="Template" Value="{StaticResource control_mouseover}"/>
                </Trigger>
                <DataTrigger Binding="{Binding ElementName=grid.Artykuły, Path=IsPressed}" Value="True">
                    <Setter Property="Template" Value="{StaticResource control_mouseover}"/>
                </DataTrigger>                  
            </Style.Triggers>
        </Style>
    </ListBox.ItemContainerStyle>
</ListBox>

但是,这应该不会导致实际错误。

第二个问题是ElementName属性显示设置为相关控件的实际name,而不是类型和名称:

<DataTrigger Binding="{Binding ElementName=Artykuły, Path=IsPressed}" Value="True">
    <Setter Property="Template" Value="{StaticResource control_mouseover}"/>
</DataTrigger>

更新>>>

要永久应用您的Template 而不仅仅是在按下Button 时使用它,只需删除DataTrigger 并将Setter 移出Triggers 集合:

<ListBox Name="listbox" Height="250" Grid.Row="4" Grid.ColumnSpan="5" HorizontalAlignment="Center">
    <ListBox.ItemContainerStyle>
        <Style TargetType="ListBoxItem">
            <Setter Property="Template" Value="{StaticResource control_not_mouseover}"/>
            <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter Property="Template" Value="{StaticResource control_mouseover}"/>
                </Trigger>            
            </Style.Triggers>
        </Style>
    </ListBox.ItemContainerStyle>
</ListBox>

很遗憾,您的 Setter 值发生了冲突,因此我不得不交换它们以使其以这种方式工作,但我相信您可以根据需要重新安排它。

【讨论】:

  • 好的,谢谢,我想如果我想访问 Grid 的元素,我需要在 ElementName 中包含网格的名称,但没关系。顺便说一句,DataTrigger 按下时会产生效果,不按下时效果会消失。我可以用什么来代替 DataTrigger 来保持效果好?
  • @michael 我认为您必须在 Button.Pressed 上使用 EventTrigger 才能做到这一点。见dotnet.dzone.com/articles/event-based-property-changes
  • 但我需要设置模板,我认为 EventTrigger 无法访问它。
  • 我也做了同样的事情,但你删除了与 Button 连接的部分。当鼠标悬停时模板应该被改变,当按钮被按下时模板应该被改变,这都是我所关心的。
  • 哦,我现在明白你的问题了……我不认为这可以用 XAML 来实现。您可能需要为 MouseEnterButton.Click 事件添加处理程序,您可以在其中永久更改 Template 属性。
【解决方案2】:
Binding="{Binding ElementName=grid.Artykuły

<Button  Name="Artykuły"

-> ElementName 与您的元素名称不匹配。

应该是:

Binding="{Binding ElementName=Artykuły

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多