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を繰り返す必要があると思う. Background プロパティをバインドすると、すべてのプロパティ変更がその ItemsControl 内のすべての Textblock に影響します。私はこのようにしたくない。個々のテキストブロックの色を個別に設定および変更したい。

そのイベントの原因となったイベントハンドラーの単一のものにアクセスできますが、アイテムコントロールにあるすべてのテキストブロックにアクセスし、いくつかのロジックに合わせて色を変更したい

4

3 に答える 3

1

axelleが提案するようなバックグラウンドバインディングを使用したソリューション:HeaderList内のアイテムを反復処理し、background-propertyを設定できます。ヘッダークラ​​スは、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 に答える
1

あなたの質問を正しく理解できれば、TextBlock の背景をデータ コンテキストの値にバインドし、マウス イベントでその値を変更する必要があります。

于 2012-09-24T07:57:08.163 に答える
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 に答える