2016-06-03 5 views
4

У меня есть ListBox, где я определил DataTemplate для своих элементов:Доступ к пункту ListBox после привязки данных

<ListBox.ItemTemplate> 
    <DataTemplate> 
     <Border> 
      <TextBlock Text="{Binding Name}" /> 
     </Border> 
    </DataTemplate> 
</ListBox.ItemTemplate> 

И класс я использую для добавления элементов в ListBox является следующее:

public class MyItem 
{ 
    public string Name 
    { get; set; } 
} 

Теперь мне нужно изменить фон пункта ListBox, когда, например, был выбран товар:

private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    if (e.AddedItems.Count == 1) 
    { 
     var item = e.AddedItems.First() as MyItem; 
    } 
} 

проблема в том, что изделие имеет тип MyItem, в то время как мне нужен доступ к объектам Border и TextBlock.

+0

Ваше приложение UWP или WPF? – SWilko

+0

@Pikoh Я прошу UWP. – gliderkite

+0

взлеты просто осознали это. Извините – Pikoh

ответ

1

Вы можете использовать фантазии RelativeSource связывания на вашем Border стиле:

<Border.Style> 
    <Style TargetType="Border"> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding IsSelected, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListBoxItem}}" Value="True"> 
       <Setter Property="Background" Value="Pink"/> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</Border.Style> 

Это создаст DataTrigger, который будет связываться с IsSelected собственности родителя ListBoxItem, когда он выбран, то он будет установить фон цвет Border до Pink.

0

проблема в том, что элемент имеет тип MyItem, в то время как мне нужен доступ к объектам Border и TextBlock.

Если вы хотите изменить фон при выборе элемента, вы можете обратиться к ответам в комментариях и к ответу @Mike Eason.

Но я думаю, что ваша основная цель - получить управление Border в выбранном вами элементе, используя SelectionChanged событие ListBox. Как предложил @ S.Akbari, вы можете использовать VisualTreeHelper, чтобы найти границу, но есть и другой более простой метод, который вы можете использовать, например.

private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    var listBox = sender as ListBox; 
    var container = listBox.ContainerFromItem(listBox.SelectedItem) as ListBoxItem; 
    var border = container.ContentTemplateRoot as Border; 
    border.Background = new SolidColorBrush(Colors.Pink); 
} 

Использование ItemsControl.ContainerFromItem method может помочь вам найти контейнер, соответствующий указанному пункту, а затем, поскольку ваш Border является контроль корень в вашем DataTemplate, мы можем использовать ContentControl.ContentTemplateRoot property, чтобы получить корневой элемент шаблона данных, указанной ContentTemplate Недвижимость.

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