2012-09-24 3 views
1

어떻게이 ItemsControl을 루프 처리하고 일부 마우스 이벤트에서이 Xaml의 코드 숨김 페이지에서 TextBlock 배경을 변경할 수 있습니까? 나는 WPF를 처음 사용한다.WPF에서 ItemsControl을 반복하는 방법은 무엇입니까?

<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의 모든 TextBlock에 영향을 미칩니다. 나는 이런 방식으로 그것을 원하지 않는다. 모든 개별 텍스트 블록의 색상을 다르게 설정하고 변경하려고합니다. ,

는 그 사건을 발생시킨 eventhandlers에서 하나 하나에 액세스 할 수 있습니다,하지만 난 ItemsControl에에있는 모든 textblocks에 액세스하고 자신의 색이 ItemsControl을 통해

답변

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(); 
    } 
} 
0

루프하지 않는 일부 논리 acoording 변경하려면 더 나은 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> 

+1

를 구현해야하지만, 단순히 배경을 결합하는 것이 더 간단하지 않을까요? –

+0

은 달성하고자하는 것에 달려 있습니다 ... "마우스가 끝났을 때 텍스트 블록 강조 표시"와 같은 간단한 작업은 트리거가 매우 사용하기 쉽고 데이터 트리거도 좋습니다. 배경 바인딩은 컨트롤을 반복하는 것보다 낫습니다. 그러나 MVVM 순수 주의자들은이 접근 방식을 좋아하지 않을 것입니다. – doerig

+0

모든 코드 예제? – SST

1

내가 제대로 질문을 이해한다면, 당신은 당신의 데이터 컨텍스트의 값으로 TextBlock의 배경을 바인딩 할, 그리고 변화를 줄이 발 마우스 이벤트에서 ue를 선택하십시오.

+0

사실 내 요구 사항은 다른 마우스 이벤트에서 개별 TextBlock의 배경색을 변경하는 것입니다. 따라서 코드 뒤에 TextBlock에 대한 액세스 권한이 필요하며 로그인에 따라 해당 TextBlock의 배경색을 적절하게 변경할 수 있습니다. 그래서 ItemsControl을 반복해야한다고 생각합니다. 배경 속성을 바인딩하면 속성 변경시 해당 ItemsControl의 모든 TextBlock에 영향을 미칩니다. 나는 이런 방식으로 그것을 원하지 않는다. 모든 개별 텍스트 블록의 색상을 다르게 설정하고 변경하려고합니다. – SST

관련 문제