2011-12-02 3 views
0

でアイテムを変更します。私が欲しいものItemsControlには、私は次のItemsControlを持っている私のSilverlightのプロジェクトで実行

<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はpublicプロパティにあり、UserControlとそのIEnumerableは任意のタイプのオブジェクトを受け取ることができます) – danbord

+0

@danbord ViewModelについて:ソースオブジェクトを変更せずに任意のプロパティを追加できるラッパーを作成します。それはアダプタやコンバータのようなものです。 ItemsSourceプロパティに関しては、最初はアイテムを含む余分なMainViewModelクラスを使用することを考えましたが、その後、単純化するために答えのコード量を減らすことに決めました。 – vorrtex

関連する問題