2011-01-07 3 views
4

Если у меня есть WPF ListBox который имеет базовый ItemTemplate, содержащий пользовательский пользовательский элемент управления, как я могу сказать пользовательский элемент управления в DataTemplate изменить свое визуальное состояние, когда его выбирают в ListBox?WPF изменить визуальное состояние DataTemplate при выборе в ListBox

Большое спасибо за любую помощь вы можете дать

ответ

7

Вы можете стиль ListBoxItem, чтобы вызвать на IsSelected собственности. Вот пример:

, а затем использовать его как это:

<ListBox ItemContainerStyle="{StaticResource yourListBoxItemStyle}"> 

или непосредственно в ListBox сам:

<ListBox.ItemContainerStyle> 
    <Style TargetType=”ListBoxItem”> 
     ... 
    </Style> 
</ListBox.ItemContainerStyle> 

Edit:

Вот полный пример как с ItemTemplate, так и с номером ItemContainerStyle, который помещает полупрозрачный слой поверх выбранного элемента.

<Grid> 
    <Grid.Resources> 
     <x:Array Type="sys:String" x:Key="sampleData"> 
      <sys:String>Red</sys:String> 
      <sys:String>Green</sys:String> 
      <sys:String>Blue</sys:String> 
     </x:Array> 
     <DataTemplate x:Key="listBoxItem"> 
      <Rectangle Fill="{Binding}" Width="100" Height="100"/> 
     </DataTemplate> 
     <Style TargetType="ListBoxItem" x:Key="listBoxItemStyle"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="ListBoxItem"> 
         <Grid> 
          <ContentPresenter /> 
          <Rectangle x:Name="Rectangle" Fill="Black" Opacity="0"/> 
         </Grid> 
         <ControlTemplate.Triggers> 
          <Trigger Property="IsSelected" Value="true"> 
           <Setter TargetName="Rectangle" Property="Opacity" 
            Value="0.5"/> 
          </Trigger> 
         </ControlTemplate.Triggers> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </Grid.Resources> 
    <ListBox 
     ItemsSource="{StaticResource sampleData}" 
     ItemTemplate="{StaticResource listBoxItem}" 
     ItemContainerStyle="{StaticResource listBoxItemStyle}" 
     /> 
</Grid> 

Редактировать

После комментария, вот версия с помощью "единого" шаблона:

<Style TargetType="ListBoxItem" x:Key="listBoxItemStyle"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="ListBoxItem"> 
       <Grid> 
        <Rectangle Name="Rectangle" Fill="{Binding}" Width="100" Height="100" Opacity="1"/> 
       </Grid> 
       <ControlTemplate.Triggers> 
        <Trigger Property="IsSelected" Value="true"> 
         <Setter TargetName="Rectangle" Property="Opacity" 
          Value="0.5"/> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
+0

так вы говорите НЕ использовать ItemTemplate вообще? – Mark

+0

Нет, продолжайте использовать свой «ItemTemplate». «ContentPresenter» в «ControlTemplate» в примере приведет к «расширению» вашего «ItemTemplate». –

+0

ОК спасибо за код, но я не вижу, как это будет работать, если я хочу изменить свойство элемента управления (в вашем случае класса Rectangle) в DataTemplate, поскольку вы не можете получить доступ к элементу управления из шаблона itemcontainer – Mark

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