0

У меня есть этот стиль:установленного значения для ListBoxItem шаблонного связывания

<Style x:Key="SelectableListBoxItemStyle" TargetType="{x:Type ListBoxItem}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type ListBoxItem}"> 

       <Border Background="Transparent" 
         BorderBrush="{TemplateBinding BorderBrush}" 
         CornerRadius="4" 
         BorderThickness="2" 
         x:Name="IconBorder" 
         Margin="4,2,4,2"> 
        <ContentPresenter/> 
       </Border> 

       <ControlTemplate.Triggers> 
        <Trigger Property="IsSelected" Value="true"> 
         <Setter TargetName="IconBorder" 
           Property="BorderBrush" 
           Value="Blue" /> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Моя проблема заключается в том, что я не знаю, какое свойство устанавливается на ListBox, потребляя мой стиль так, что границы это ListBoxItems бы в результате получится требуемая пограничная кисть. Я также хотел бы сделать эту работу для другой граничной кисти в моем стиле.

Я хотел бы иметь два списка с этим же стилем, но с разными цветами границ. У меня есть это для ListBox:

<ListBox 
     ItemsSource="{Binding SelectedProduct.Pictures}" 
     SelectedItem="{Binding SelectedSet, Mode=TwoWay}" 
     ItemContainerStyle="{StaticResource ResourceKey= SelectableListBoxItemStyle}"> 
    </ListBox> 

Update..I попытался это:

<ListBox 
     ItemsSource="{Binding SelectedProduct.Pictures}" 
     SelectedItem="{Binding SelectedSet, Mode=TwoWay}"> 

      <ListBox.ItemContainerStyle> 
       <Style TargetType="{x:Type ListBoxItem}" BasedOn="{StaticResource SelectableListBoxItemStyle}"> 
        <Setter TargetName="IconBorder" Property="BorderBrush" Value="Green" /> 
       </Style> 
      </ListBox.ItemContainerStyle> 

     </ListBox> 

Но, я получаю: Ошибка 8 Имя_целевого_объекта свойство не может быть установлен на стиль сеттер.

ответ

1

Вместо использования TemplateBinding вы должны попытаться использовать относительный источник связывания.

BorderBrush="{Binding RelativeSource={RelativeSource FindAncestor, 
             AncestorType={x:Type Listbox}}, 
             Path=BorderBrush}" 

Если вы хотите иметь другую границу, чем определено для ListBox, то вам нужно будет добавить кисти ресурс к вашему ResourceDictionary и применить, что вместо того, чтобы:

<Listbox.Resources> 
    <SolidColorBrush x:Key="MyListBoxItemBorderBrush" Color="Red"/> 
<Listbox.Resources> 

, а затем в шаблоне :

BorderBrush="{StaticResource MyListBoxItemBorderBrush}" 

Если вам нужны определенные элементы имеют разные границы, то вы должны смотреть на StyleSelector.

+0

Спасибо за ваш ответ. См., Я уже установил стиль контейнера элементов в списке на «SelectableListBoxItemStyle», который вставлен в мой вопрос. Проблема заключается в «BorderBrush =» {TemplateBinding BorderBrush} ". Как я * устанавливаю * это, когда я использую стиль в xaml? То есть. какое свойство я должен установить в окне списка, чтобы граница моего ListBoxItem заканчивалась наличием установленной граничной кисти? –

+0

Еще раз спасибо. Второй работает, но теперь мой ListBox должен иметь тот же BorderBrush, что и ListBoxItems, что не так уж и велико. Я отредактировал мой вопрос, чтобы добавить обновление, возможно, вы можете исправить это :) –

+0

О, хороший! Трюк ресурса прибил его. Большое спасибо :) –

0

Я не уверен на 100%, но я думаю, что для этого вам может понадобиться специальный элемент управления. По крайней мере, я знаю, что вы можете сделать это с помощью специального элемента управления!

Если вы создаете пользовательский элемент управления, который простирается от ListBox, который включает этот стиль, который вы создали, вы можете создать в нем вложенное свойство (что-то вроде ItemBorderColor), которое вы могли бы связать с BorderColor вашей границы (на самом деле, для эффект выбора, вы можете создать триггер для ControlTemplate(), который применяет значение «ItemBorderColor» к границе BorderColor на основе свойства «IsSelected»).

Там может быть чисто XAML способ сделать это, но я не знаю ....

+0

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

+0

Глядя на ответ Бенджамина, он подтверждает, что для хранения значения «ItemBorderColor» вам понадобится какой-то контейнер памяти (или свойство). Именно здесь (я думаю) XAML отстает, так как это не позволит вам «создать» новое свойство в стиле. Возможно, я ошибаюсь ... – JFTxJ

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