Accessing an ItemsControl item as it is added
In a previous post, I was advised to use a DataTemplate to render a group of Buttons and Labels, and it works wonderfully. The problem is that I have several of these groups of Buttons, and I would like to distinguish one group from another. I plan to use the AlternatingIndex to color each group differently, but that's not enough -- each group actually needs to have its index printed as well.
Here's a contrived example... let's say the Item looks something like this:
Lock Door
Safe Unlock Door
Sound Alarm
If I have a room full of these safes, I'd like to know which one I'm accessing. Therefore, I'd like the list to look like this:
Lock Door
Safe #1 Unlock Door
Sound Alarm
Lock Door
Safe #2 Unlock Door
Sound Alarm
My ItemsControl (ListBox) is bound to a List in code-behind. After doing some research here on SO, it seems like I need to somehow bind the ItemsControl.Count property. One idea I 开发者_Python百科had was to pass the Content through an IValueConverter. The Content would be databound to ItemsControl.Count. Then the IValueConverter would just format the string to be "Safe #{0}".
It's the databinding part that I'm once again faltering on. The DataContext for this ItemsControl is my ViewModel... so I can only guess that I need to specify a Binding that will give me the ItemsControl instead of the ViewModel.
Is this the right idea? If so, can someone help me with the Binding? If not, what other methods might I try?
To provide a property for binding that represents the index of the item in the collection, set the AlternationCount
property to some huge value (larger than the maximum possible number of items in the collection), then you can bind to it from your data template thus:
{Binding RelativeSource={RelativeSource TemplatedParent},
Path=TemplatedParent.(ItemsControl.AlternationIndex)}
Also, you will have to tweak your alternation count converter to do the modulus in code, since you're no longer cycling the index automatically (because of the big value of AlternationCount
).
@Aviad: thanks, I'll try that! Just for completion's sake, I wanted to post what I had just tried. I finally got the databinding to work the way I had proposed:
<Label Grid.Row="1" Grid.Column="0" Content="{Binding Path=Items.Count, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBox}}}"></Label>
The end result was wrong -- all of the ListBox items had the index "4", so I guess the Content of all of the Labels gets evaluated after the items are added to the container. Interesting!
精彩评论