2

如何循环遍历此 ItemsControl 并在此 Xaml 的代码隐藏页面中更改它的 TextBlock 背景。我是 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>

提前致谢!!

实际上我的要求是在不同的鼠标事件上更改单个 TextBlock 的背景颜色。所以我需要在后面的代码中访问 TextBlock,根据登录我可以相应地更改 Textblock 的背景颜色。所以我认为需要迭代ItemsControl。如果我绑定背景属性,那么所有属性更改都会影响该 ItemsControl 中的所有文本块。我不想这样。我想以不同的方式设置和更改每个单独的文本块的颜色。

我可以访问导致该事件的事件处理程序中的单个,但我想访问 itemscontrol 中的所有文本块并根据某些逻辑更改它们的颜色

4

3 回答 3

1

如果我正确理解您的问题,您希望将 TextBlock 背景绑定到数据上下文中的值,并在鼠标事件中更改该值。

于 2012-09-24T07:57:08.163 回答
1

使用 axelle 建议的背景绑定解决方案:您可以遍历 HeaderList 中的项目并设置背景属性。Header 类必须实现 INotifyPropertyChanged 接口

<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();
    }
}
于 2012-09-24T09:16:04.400 回答
0

不要循环通过项目控件,最好使用触发器将更改应用于您的文本块:)

<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>

于 2012-09-24T07:56:57.870 回答