2011-12-02 5 views
0

в моем Silverlight проекта У меня есть следующие 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> 

Что я хочу: Когда мой пользователь нажимает на элементе. Я хочу, чтобы все остальные объекты Opacity установлены на «0.3». Когда мышь выпущена, я хочу, чтобы все предметы возвращались в исходное состояние (Opacity = "1").

+0

Вы можете попробовать создать 'MultiTrigger' на' Mouse.IsLeftButtonDown = True' и 'ItemsControl.IsMouseOver = True' и' txtUserName.IsMouseOver = False'. Вероятно, это не фактические имена свойств, но он должен дать вам идею – Rachel

ответ

2

Это очень просто, если использовать шаблон MVVM. Добавьте Opacity свойство к классу элемента и привязать его к Border.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 about: создать оболочку, к которой вы можете добавить любые свойства, которые вы хотите, без изменения исходных объектов. Это похоже на адаптер или конвертер. Что касается свойства ItemsSource, сначала я решил использовать дополнительный класс MainViewModel, который содержит элементы, но затем я решил уменьшить количество кода в ответе, чтобы сделать его более простым. – vorrtex

Смежные вопросы