2016-04-28 2 views
1

У меня есть ListBox для addresses. Каждый элемент является форматированной меткой адреса, используя DataTemplate.Изменить фон на один элемент списка в списке (Не выбранный элемент)

Когда пользователь выбирает элемент в списке и нажимает кнопку Set to default, я хотел бы изменить цвет фона этого элемента, чтобы обозначить значение по умолчанию.

Я хочу изменить только один элемент, а не SelectedItem ... так что SelectedItem может быть одного цвета, а DEFAULT может быть другого цвета.

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

Моя проблема заключается в том, что ListBox.SelectedItem только позволяет мне доступ к основной объект в коллекции, в данном случае Address.

Итак, следующий не будет работать:

foreach (ListBoxItem item in lstShipToAddresses.Items) 
{ 
    // does not work (can't cast Address to ListboxItem) 
    item.Background = Brushes.Magenta;   
} 

Как я могу получить доступ на фоне определенного ListBoxItem?

У меня есть план B который включает в себя только с помощью другой области за пределами ListBox для отображения по умолчанию address, но что бы сожрать немного больше места на экране с, так что я пытаюсь избежать этого.

Update (XAML):

<ListBox Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" 
     HorizontalAlignment="Stretch" 
     HorizontalContentAlignment="Stretch" 
     Name="lstShipToAddresses" 
     ItemsSource="{Binding Path=ocShipToAddress}" 
     SelectionChanged="lstShipToAddresses_SelectionChanged" 
     SelectedValuePath="Address_ID"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <Border BorderBrush="#FF000000" BorderThickness="2,2,2,2" CornerRadius="10" HorizontalAlignment="Stretch" > 
       <Grid HorizontalAlignment="Stretch"> 
        <Grid.RowDefinitions> 
         <RowDefinition Height="Auto" /> 
        </Grid.RowDefinitions> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="Auto" /> 
        </Grid.ColumnDefinitions> 
        <StackPanel> 
         <TextBlock Grid.Row="0" Text="{Binding Path=Address_Label}" HorizontalAlignment="Stretch"></TextBlock> 
        </StackPanel> 
       </Grid> 
      </Border> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

Окончательное решение:

Этот код выполняется в пределах нажатием кнопки, так что SelectedItem является тот, который мы хотим сделать по умолчанию.

for (int i = 0; i < lstShipToAddresses.Items.Count; i++) 
{ 
    if (lstShipToAddresses.Items[i] == lstShipToAddresses.SelectedItem) 
    { 
     // Set background on default 
     var listBoxItem = lstShipToAddresses.ItemContainerGenerator.ContainerFromIndex(i); 
     (listBoxItem as ListBoxItem).Background = Brushes.Magenta; 
    } 
    else 
    { 
     // Reset background on non-default 
     var listBoxItem = lstShipToAddresses.ItemContainerGenerator.ContainerFromIndex(i); 
     (listBoxItem as ListBoxItem).Background = Brushes.White; 
    } 
} 
  • Может потребоваться изменить Magenta к менее пугающей цвет;)
+0

Вы можете использовать ItemContainerStyle. – Amine

+0

Что делать, если вы сделали следующее, чтобы увидеть, изменит ли он цвет @pStan 'item.Background = new SolidColorBrush (Colors.Red);' тогда, если он использует ваш цвет Magenta – MethodMan

+0

Элемент имеет тип «Адрес ", поэтому у него нет свойства« Фон » – pStan

ответ

1

Вы должны использовать ItemContainerGenerator.ContainerFromIndex для этой цели. Она возвращает DependencyObject, то вы можете привести его к ListBoxItem и использовать свойство ListBoxItem «s как Background:

for (int i = 0; i < lstShipToAddresses.Items.Count; i++) 
{ 
    var listBoxItem = lstShipToAddresses.ItemContainerGenerator.ContainerFromIndex(i); 
    (listBoxItem as ListBoxItem).Background = Brushes.Magenta; 
} 
+0

Спасибо за подробный ответ. Это то, что мне нужно. – pStan

+0

@pStan ... Добро пожаловать. :) Также я думаю, что если вы обновите свой вопрос и измените его название на «Невозможно наложить объект типа« Адрес »на тип« System.Windows.Controls.ListBoxItem'. », вы поможете будущему посетителю найти свой вопрос больше. –