2016-04-28 8 views
1

addressesの場合はListBoxです。各項目は、DataTemplateを使用して書式設定された住所ラベルです。リストボックス内の1つのリストアイテムの背景を変更します(選択したアイテムではありません)

ユーザーがリスト内のアイテムを選択してSet to defaultボタンをクリックすると、そのアイテムの背景色をデフォルトに変更したいと思います。

SelectedItemではなく、その1つのアイテムのみを変更したいのです... SelectedItemは1色で、DEFAULTは異なる色になる可能性があります。

私は非デフォルトにリセットし、デフォルトを設定するループを必要とする場合でも...実用的にこれをやりたい...

私の問題はListBox.SelectedItemは私だけ根底へのアクセスを可能にするということですコレクションのオブジェクト(この場合はAddress)。

ので、以下では動作しません。

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

はどのようにして、特定のListBoxItemの背景にアクセスすることができますか?

は、私は単にデフォルトaddressを表示するListBox外の別の領域を使用することを含む計画Bを持っているが、それはもう少し画面スペースを飲み込んでしまうので、私はそれを避けるためにしようとしています。

アップデート(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; 
    } 
} 
  • 少ない怖い色にマゼンタを変更する必要があるかもしれません。)
+0

あなたはItemContainerStyleを使用することができます。 – Amine

+0

色を変更するかどうかを確認するために次のようにした場合@ 012Stack 'item.Background = new SolidColorBrush(Colors.Red);'次に、 'Magenta'色を使用する場合 – MethodMan

+0

項目は「Address "ので、" Background "というプロパティはありません – pStan

答えて

1

あなたは、この目的のためにItemContainerGenerator.ContainerFromIndexを使用する必要があります。それはDependencyObject、あなたがListBoxItemにキャストし、BackgroundようListBoxItemのプロパティを使用することができますが返されます。

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 ...あなたはようこそ。 :)あなたの質問を更新し、タイトルを 'Type 'のオブジェクトをキャストすることができない' Address 'を' System.Windows.Controls.ListBoxItem 'とタイプすると、将来の訪問者があなたの質問をもっと見つけるのを助けるでしょう。 –

関連する問題