2011-12-02 4 views
0

에서 항목을 수정 ItemsControl에 나는 다음과 같은 ItemsControl에 있습니다내 실버 라이트 프로젝트에서 실행

<ItemsControl x:Name="ItemsList"> 
    <ItemsControl.ItemsPanel> 
    <ItemsPanelTemplate> 
     <StackPanel Orientation="Vertical" /> 
    </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 

    <ItemsControl.ItemTemplate> 
    <DataTemplate> 

     <Border x:Name="brdItem" Opacity="1" MouseLeftButtonDown="brdItem_MouseLeftButtonDown"> 
      <TextBlock x:Name="txtUsername" Text="{Binding Username}" /> 
     </Border> 

    </DataTemplate> 
    </ItemsControl.ItemTemplate> 

</ItemsControl> 

내가 원하는 것은 : 때 항목 내 사용자가 클릭. 불투명도가 "0.3"으로 설정된 다른 모든 항목을 원합니다. 마우스를 놓으면 모든 항목을 원래 상태 (Opacity = "1")로 되돌리려합니다.

+0

'Mouse.IsLeftButtonDown = True','ItemsControl.IsMouseOver = True' 및'txtUserName.IsMouseOver = False'에서'MultiTrigger'를 만들 수 있습니다. 그것들은 실제 속성 이름이 아닐지라도 당신에게 아이디어를 주어야합니다. – Rachel

답변

2

MVVM 패턴을 사용하면 매우 간단합니다. Border.Opacity 속성에 항목 클래스에 Opacity 속성을 추가하고 바인딩 :

<Border x:Name="brdItem" Opacity="{Binding Opacity}" MouseLeftButtonDown="brdItem_MouseLeftButtonDown"> 
    <TextBlock x:Name="txtUsername" Text="{Binding Username}" /> 
</Border> 

항목 클래스 :

마우스 이벤트가 그렇게 보이는 것
public class ItemViewModel : INotifyPropertyChanged 
{ 
    public string Username { get; set; } 

    private double _opacity; 

    public double Opacity 
    { 
     get { return _opacity; } 
     set 
     { 
      _opacity = value; 
      RaisePropertyChanged("Opacity"); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected virtual void RaisePropertyChanged(string propertyName) 
    { 
     if (this.PropertyChanged != null) 
     { 
      this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

후 것을 :

public void brdItem_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
    { 
     var vm = ((FrameworkElement)sender).DataContext as ItemViewModel; 
     if (vm != null) 
     { 
      vm.Opacity = 1; 
      this.ItemsList.ItemsSource.OfType<ItemViewModel>() 
       .Where(item => item != vm) 
       .ToList() 
       .ForEach(item => item.Opacity = 0.3); 
     } 
    } 

초기 상태로 돌아가려면 다음 코드를 사용하십시오.

this.ItemsList.ItemsSource.OfType<ItemViewModel>() 
    .ToList().ForEach(item => item.Opacity = 1); 
+0

큰 제안이지만, 내 개체에 "불투명도"속성을 추가하고 싶지는 않습니다. (실제로 ItemsSource는 공용 속성 인 UserControl과 그 IEnumerable 객체이므로 어떤 유형의 객체도받을 수 있습니다.) – danbord

+0

@danbord ViewModel은 소스 객체를 변경하지 않고 원하는 모든 속성을 추가 할 수있는 래퍼를 만듭니다. 그것은 어댑터 또는 변환기와 같습니다. ItemsSource 속성에 관해서는, 처음 엔 아이템을 포함하는 여분의 MainViewModel 클래스를 사용하려고 생각했지만, 그 다음에는 좀 더 단순하게 만들기 위해 대답의 코드 양을 줄이기로 결정했습니다. – vorrtex