2013-10-10 22 views
0

我的想法是改變一個ListBoxItem的外觀時,點擊鼠標懸停或按鈕時等DataTrigger在ItemContainerStyle不改變模板列表框

<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> 
+1

什麼是grid.Artykuły?它在哪裏? – Nitin

+0

我更新了。 Grid和Listbox都在StackPanel中,看看問題的結尾。 – Maximus

+0

對不起,DataTrigger根本不工作,這是問題所在。 – Maximus

回答

2

我看到了一些與你的代碼的問題。首先,您不需要爲truefalse條件添加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> 

UPDATE >>>

永久應用的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值發生了衝突,因此我必須將它們交換以使其以這種方式工作,但我相信您可以根據自己的情況重新安排它。

+0

好的,謝謝,我想如果我想訪問元素的網格,我需要包含在ElementName名稱的網格中,但是沒關係,順便說一下,DataTrigger在按下時會產生效果,當效果消失時效果會消失,我可以用DataTrigger來保持效果嗎? – Maximus

+0

@michael我認爲您必須在Button.Pressed上使用EventTrigger,要做到這一點。請參閱http://dotnet.dzone.com/articles/event-based-property-changes – franssu

+0

但我需要設置模板,我不認爲它可以通過EventTrigger。 – Maximus

1
Binding="{Binding ElementName=grid.Artykuły 

<Button Name="Artykuły" 

- >的ElementName不符合您的元素的名稱。

應該是:

Binding="{Binding ElementName=Artykuły