2013-10-09 2 views
0

Я использую ListBox itemstyle и триггера, чтобы изменить цвет курсора, находящиеся но стиль, кажется, не работает:Wpf ListBox itemstlye триггеров не работает

<ListBox ItemsSource="{Binding LocationItems}" SelectionChanged="RadListBox_SelectionChanged" Name="RLBLocations"> 
         <ListBox.ItemContainerStyle> 
          <Style TargetType="ListBoxItem"> 
           <Setter Property="BorderBrush" Value="#FF709A70"/> 
           <Setter Property="Height" Value="50"/> 
           <Setter Property="Width" Value="200"/> 
           <Setter Property="Foreground" Value="#FF5C5C5C"/> 
           <Setter Property="FontFamily" Value="Franklin Gothic Book"/> 
           <Setter Property="FontSize" Value="16"/> 
           <Setter Property="Template"> 
            <Setter.Value> 
             <ControlTemplate TargetType="{x:Type ListBoxItem}"> 
              <StackPanel Orientation="Horizontal" Height="50"> 
               <Image Source="{Binding Icon}" Margin="0" Stretch="UniformToFill" Width="32" Height="32"/> 
               <TextBlock Margin="10,10,0,0" Text="{Binding Text.Text}" Foreground="Black" TextAlignment="Left"/> 
              </StackPanel> 
             </ControlTemplate> 
            </Setter.Value> 
           </Setter> 
           <Setter Property="ToolTip" Value="{Binding ToolTip}"/> 
           <Setter Property="BorderThickness" Value="1"/> 
           <Setter Property="Background" Value="#FFF0F0F0"/> 
           <Style.Triggers> 
            <DataTrigger Binding="{Binding 
          RelativeSource={RelativeSource 
           Mode=FindAncestor, 
           AncestorType={x:Type ListBoxItem}}, 
           Path=IsMouseOver}" Value="True"> 
             <Setter Property="Background" Value="#FF709A70"/> 
            </DataTrigger> 
           </Style.Triggers> 
          </Style> 
         </ListBox.ItemContainerStyle> 
        </ListBox> 

Я получаю эту ошибку в окне вывода:

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.ListBoxItem', AncestorLevel='1''. BindingExpression:Path=IsMouseOver; DataItem=null; target element is 'ListBoxItem' (Name=''); target property is 'NoTarget' (type 'Object') 

Я понимаю, что ошибка, но мне нужна помощь, пытаясь выяснить стиль - я попытался сделать это с помощью datatemplate, и это тоже не сработало.

ответ

1

Ваш DataTrigger:

<DataTrigger Binding="{Binding RelativeSource={RelativeSource 
                Mode=FindAncestor, 
                AncestorType={x:Type ListBoxItem}}, 
            Path=IsMouseOver}" 
       Value="True"> 
    <!-- ... --> 
    </DataTrigger> 

пытается найти Предок (типа ListBoxItem) в ListBoxItem. Конечно, этого не существует, если вы не в гнезде ListBoxItems внутри друг друга.

Изменить его к этому:

<Trigger Property="IsMouseOver" Value="True"> 
    <!-- ... --> 
</Trigger> 

Кроме того, вы переопределение шаблона по ListBoxItem «s, и в пользовательском шаблоне нет ничего указывая на ListBoxItem.Background собственности, что кисть не будет видна на экране.

Я предлагаю вам использовать его для Фоновая StackPanel в:

<ControlTemplate TargetType="{x:Type ListBoxItem}"> 
    <StackPanel Orientation="Horizontal" Height="50" Background="{TemplateBinding Background}"> 
     <!-- ... --> 
    </StackPanel> 
</ControlTemplate> 

Кроме того, я думаю, вы могли бы ввести в заблуждение понятие ListBoxItem.Template с ListBox.ItemTemplate, который является DataTemplate используется для отображения вашего Data внутри регулярного ListBoxItems. Я предлагаю вам взглянуть на this tutorial для получения дополнительной информации.

+1

' ' Безразлично 't work – jharr100

+0

@ jhar100 see my edit –

+0

будет делать @tutorial предложение – jharr100

Смежные вопросы