SST
SST

Reputation: 459

How to loop through ItemsControl in WPF?

How can I loop through this ItemsControl and change it's TextBlock background in this Xaml's code behind page on some mouse event. I am new to WPF.

 <ItemsControl ItemsSource="{Binding Path= HeaderList}" Name="Headers">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <TextBlock Name="Data"   Text="{Binding }" Width="100" HorizontalAlignment="Left" PreviewMouseLeftButtonDown="MouseLeftButtonDown_Handler" 
                            MouseEnter="MouseEnter_Handler" MouseLeave="MouseLeave_Handler">
                </TextBlock>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>

Thanks in advance!!

Actually my requirement is to change individual TextBlock's background color on different mouse events. So i need to get access of TextBlock in code behind and depending upon login I can change that Textblock's background color accordingly. So i think need to iterate ItemsControl. in case if I bind Background Property then all on property change would have effect on all the Textblocks in that ItemsControl. I don't want it in this way. I want to set and change every individual textblock's color differently.

I have access to single one in the eventhandlers that caused that event, but I want to access all the textblocks that are in itemscontrol and change their color acoording to some logic

Upvotes: 2

Views: 2903

Answers (3)

doerig
doerig

Reputation: 1857

Solution with background binding like axelle suggested: You can iterate through the items in the HeaderList and set the background-property. The Header class must implement the INotifyPropertyChanged Interface

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfApplication1" x:Class="WpfApplication1.MainWindow"
    Title="MainWindow" Height="350" Width="525">

<ItemsControl ItemsSource="{Binding Path=HeaderList}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Text}" Background="{Binding Background}" />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

public partial class MainWindow : Window
{
    public class Header : NotificationObject
    {
        public string Text { get; set; }
        public Brush Background { get; set; }
    }

    public IList<Header> HeaderList { get; set; }

    public MainWindow()
    {
        HeaderList = new List<Header>
        {
            new Header {Text = "header1", Background = Brushes.Red},
            new Header {Text = "header2", Background = Brushes.Blue},
            new Header {Text = "header3", Background = Brushes.Chartreuse},
        };

        DataContext = this;

        InitializeComponent();
    }
}

Upvotes: 1

Axelle Ziegler
Axelle Ziegler

Reputation: 2655

If I understand your question correctly, you'd want to bind the TextBlock background to a value in your datacontext, and change that value on your mouse event.

Upvotes: 1

doerig
doerig

Reputation: 1857

don't loop through the itemscontrol, better use a Trigger to apply the changes to your textblock :)

<ItemsControl ItemsSource="{Binding Path= HeaderList}" Name="Headers">
<ItemsControl.ItemTemplate>
    <DataTemplate>
        <TextBlock Text="{Binding}">
            <TextBlock.Style>
                <Style TargetType="TextBlock">
                    <Style.Triggers>
                        <Trigger Property="IsMouseOver" Value="true">
                            <Setter Property="Background" Value="Red" />
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </TextBlock.Style>
        </TextBlock>
    </DataTemplate>
</ItemsControl.ItemTemplate>

Upvotes: 0

Related Questions