2013-08-27 2 views
0

У меня есть ListBox, где цвет фона элементов связаны с какой-то свойство записи:Keeping coustum стиль ListBoxItem при выборе

<ListBox ItemsSource="{Binding ObservableCollectionOfFoos}" > 
    <ListBox.ItemContainerStyle > 
     <Style TargetType="ListBoxItem" > 
      <Setter Property="Content" Value="{Binding SomePropertyOfFoo}"/> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding AnotherPropertyOfFoo}" Value="true"> 
        <Setter Property="Background" Value="Green" /> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </ListBox.ItemContainerStyle> 
</ListBox> 

Это работает, но когда я мыши или выбрать пункт повестки дня, фоновые изменения (неудивительно, возможно,) по умолчанию мыши над/выбранным цветом.

Я новичок в WPF, и я не уверен, что я буду делать это правильно, я подумал, может быть, мне нужно использовать ItemContainerStyleSelector, но я смущен относительно того, как его использовать, и кажется глупым создать класс именно для этой маленькой вещи ...

То, что я также думал, было создать IValueConverter от булева до цвета, а затем привязать его, не используя DataTrigger в качестве другого подхода , громче, чем быть более элегантным? будет ли кто-то помогать мне в решении этой проблемы?

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

Было бы хорошо, если бы я мог изменить цвет фона выбранного элемента к другому цвету на основе AnotherPropertyOfFoo, если это не слишком много, чтобы спросить

редактировать 2 (расширение комментировать @Sheridan ответ):

это не работает

<ListBox> 
     <ListBox.Items> 
      <ListBoxItem>one</ListBoxItem> 
      <ListBoxItem>two</ListBoxItem> 
      <ListBoxItem>three</ListBoxItem> 
      <ListBoxItem>four</ListBoxItem> 
     </ListBox.Items> 
     <ListBox.ItemContainerStyle> 
      <Style TargetType="ListBoxItem"> 
       <Setter Property="Background" Value="Green" /> 
       <Style.Resources> 
        <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Red" /> 
        <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Red" /> 
        <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="Black" /> 
        <SolidColorBrush x:Key="{x:Static SystemColors.ControlTextBrushKey}" Color="Black" /> 
       </Style.Resources> 
      </Style> 
     </ListBox.ItemContainerStyle> 
    </ListBox> 

ответ

0

Попробуйте использовать это:

<ListBox ItemsSource="{Binding ObservableCollectionOfFoos}" > 
    <ListBox.ItemContainerStyle > 
     <Style TargetType="ListBoxItem" > 
      <Setter Property="Content" Value="{Binding SomePropertyOfFoo}"/> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding AnotherPropertyOfFoo}" Value="true"> 
        <Setter Property="Background" Value="Green" /> 
       </DataTrigger> 
      </Style.Triggers> 
      <Style.Resources> 
       <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Transparent" /> 
       <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Transparent" /> 
       <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="Black" /> 
       <SolidColorBrush x:Key="{x:Static SystemColors.ControlTextBrushKey}" Color="Black" /> 
      </Style.Resources> 
     </Style> 
    </ListBox.ItemContainerStyle> 
</ListBox> 

SystemColors.HighlightBrushKey представляет цвет фона по умолчанию для выбранного элемента в контрольной Сборнике ... здесь он установлен в Transparent, но вы можете установить его, к которому когда-либо цвет вы предпочитаете.

UPDATE >>>

Этот код прекрасно работает ... если вы измените первый SolidColorBrush в разделе Resources к Red, то выбранный элемент цвет фона будет Red. Ваш Binding из AnotherPropertyOfFoo не повлияет на выбранный элемент, так как между ними нет никакой связи. Чтобы достичь этого, вы можете попробовать это вместо:

<ListBox ItemsSource="{Binding ObservableCollectionOfFoos}" > 
    <ListBox.ItemContainerStyle > 
     <Style TargetType="ListBoxItem" > 
      <Setter Property="Content" Value="{Binding SomePropertyOfFoo}"/> 
      <Style.Triggers> 
       <Trigger Property="IsSelected" Value="True"> 
        <Setter Property="Background" Value="{Binding AnotherPropertyOfFoo}" /> 
       </DataTrigger> 
      </Style.Triggers> 
      <Style.Resources> 
       <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Transparent" /> 
       <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Transparent" /> 
       <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="Black" /> 
       <SolidColorBrush x:Key="{x:Static SystemColors.ControlTextBrushKey}" Color="Black" /> 
      </Style.Resources> 
     </Style> 
    </ListBox.ItemContainerStyle> 
</ListBox> 

Теперь выбранный элемент будет получить цвет фона из AnotherPropertyOfFoo собственности.

+0

Привет, спасибо за ответ, но это, похоже, не имеет никакого эффекта. – pseudoDust

+0

Прошу прощения, я не уверен, что я делаю неправильно, но это просто не имеет никакого эффекта. Я изолировал его в простейшем примере, который мог бы создать, и он все еще не работает, см. Редактирование моего сообщения для кода, который я использовал, может быть, вы можете найти мою ошибку. – pseudoDust

1

Вы также можете переопределить Template of ListBoxItem, извлечь значение по умолчанию, используя blend и переопределить или использовать some, уже упомянутый здесь.

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

На самом деле это не так трудно, чтобы переопределить шаблон :) и я предполагаю, что это самый правильный способ, чтобы решить вашу проблему. Попробуйте этот стиль ItemContainer. Он заменяет стиль по умолчанию ListBoxItem style-> Template. Чтобы узнать, как это работает - в триггерах вы можете изменить любое свойство элемента списка.

<ListBox.ItemContainerStyle> 
      <Style TargetType="{x:Type ListBoxItem}"> 
       <Setter Property="Background" Value="Transparent"/> 
       <Setter Property="Padding" Value="2,0,0,0"/> 
       <Setter Property="Template"> 
        <Setter.Value> 
         <ControlTemplate TargetType="ListBoxItem"> 
          <Border Name="Border" Padding="2" SnapsToDevicePixels="true"> 
           <ContentPresenter /> 
          </Border> 
          <ControlTemplate.Triggers> 
           <Trigger Property="IsMouseOver" Value="true"> 
            <Setter TargetName="Border" Property="Background" Value="LightBlue"/> 
           </Trigger> 
           <Trigger Property="IsSelected" Value="true"> 
            <Setter TargetName="Border" Property="Background" Value="Blue"/> 
           </Trigger> 
           <Trigger Property="IsEnabled" Value="false"> 
            <Setter Property="Foreground" Value="Gray"/> 
           </Trigger> 
          </ControlTemplate.Triggers> 
         </ControlTemplate> 
        </Setter.Value> 
       </Setter> 
      </Style> 
     </ListBox.ItemContainerStyle> 

стиль по умолчанию ListBoxItem вы можете найти here сделать необходимые изменения.

+0

Я не использую смесь, и, честно говоря, Я предпочел бы избежать этого решения, поскольку это похоже на убийство мухи с тактическим ядерным оружием ... там должен быть простой путь вперед, не так ли? – pseudoDust

+1

Возьмите стиль из отредактированного сообщения и попробуйте поэкспериментировать. Надеюсь это поможет. –

+0

Хорошо, спасибо, но я все еще хочу привязать цвет к логическому свойству, мне нужно использовать IValueConverter? – pseudoDust

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