2012-01-31 86 views
0

我在ListView MultiSelection中遇到了問題。MultiSelection不能在ListView中工作

這是我的代碼:

private ICommand _excludeCurveCommand; 


    public ICommand ExcludeCurveCommand 
    { 
     get 
     { 
      if (_excludeCurveCommand == null) 
       _excludeCurveCommand = new DelegateCommand<object>(param => this.ExcludeCurveExecuted(param)); 

      return _excludeCurveCommand; 
     } 
    } 

    /// <summary> 
    /// Executed event for ContextMenu --> Remove click 
    /// </summary> 
    /// <param name="param">param is FolderItemViewModel bound as CommandParameter</param> 
    private void ExcludeCurveExecuted(object param) 
    { 

     ICollection<object> curves = param as ICollection<object>; 
     int count = curves.Count; 
    } 



< Button Content="Exclude" Command="{Binding ExcludeCurveCommand}" CommandParameter="{Binding SelectedItems,ElementName=lstView}" .../> 

< ListView Name="lstView" ItemsSource="{Binding MyList}" SelectionMode="Extended" ..../> 

在這裏,我使用的移位,並從第一四個項目選擇。但是在ExcludeCurveExecuted方法中,我總是得到一些隨機數。這是什麼問題。

編輯: *我不wantto與IsSelected標誌進去視圖模型

+0

,我不知道發生了什麼。在重新分解代碼之後,它按預期工作。但我沒有發現任何重大變化。呃不知道。現在以任何方式工作。 – Mohanavel 2012-02-01 10:19:54

回答

1

對我來說,看來你已經啓用ListView UI虛擬化,因爲它默認啓用。這意味着,ListView僅繪製UI上可見的項目。

這裏是MSDN link

可以肯定的是什麼(你的情況一樣選擇)在接口去恐怕你沒有任何其他選項,然後

  • 或禁用UI虛擬化(不好)

  • 或模型視圖

實施 IsSelected標誌

祝你好運。

+0

嗯,我最後添加了IsSelected標誌,但是使用它。 – Mohanavel 2012-02-01 10:19:42

1

您可以使用行爲來同步所選項目集合在你的視圖模型....

你一個已經到參考System.Windows.Interactivity作爲別名添加到您的項目,以及它的XAML

Beahvior

public class MultiSelectionBehavior : Behavior<ListView> 
    { 
     protected override void OnAttached() 
     { 
      base.OnAttached(); 
      if (SelectedItems != null) 
      { 
       AssociatedObject.SelectedItems.Clear(); 
       foreach (var item in SelectedItems) 
       { 
        AssociatedObject.SelectedItems.Add(item); 
       } 
      } 
     } 

public IList SelectedItems 
{ 
    get { return (IList)GetValue(SelectedItemsProperty); } 
    set { SetValue(SelectedItemsProperty, value); } 
} 

public static readonly DependencyProperty SelectedItemsProperty = 
    DependencyProperty.Register("SelectedItems", typeof(IList), typeof(MultiSelectionBehavior), new UIPropertyMetadata(null, SelectedItemsChanged)); 

private static void SelectedItemsChanged(DependencyObject o, DependencyPropertyChangedEventArgs e) 
{ 
    var behavior = o as MultiSelectionBehavior; 
    if (behavior == null) 
     return; 

    var oldValue = e.OldValue as INotifyCollectionChanged; 
    var newValue = e.NewValue as INotifyCollectionChanged; 

    if (oldValue != null) 
    { 
     oldValue.CollectionChanged -= behavior.SourceCollectionChanged; 
     behavior.AssociatedObject.SelectionChanged -= behavior.ListViewSelectionChanged; 
    } 
    if (newValue != null) 
    { 
     behavior.AssociatedObject.SelectedItems.Clear(); 
     foreach (var item in (IEnumerable)newValue) 
     { 
      behavior.AssociatedObject.SelectedItems.Add(item); 
     } 

     behavior.AssociatedObject.SelectionChanged += behavior.ListViewSelectionChanged; 
     newValue.CollectionChanged += behavior.SourceCollectionChanged; 
    } 
} 

private bool _isUpdatingTarget; 
private bool _isUpdatingSource; 

void SourceCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
{ 
    if (_isUpdatingSource) 
     return; 

    try 
    { 
     _isUpdatingTarget = true; 

     if (e.OldItems != null) 
     { 
      foreach (var item in e.OldItems) 
      { 
       AssociatedObject.SelectedItems.Remove(item); 
      } 
     } 

     if (e.NewItems != null) 
     { 
      foreach (var item in e.NewItems) 
      { 
       AssociatedObject.SelectedItems.Add(item); 
      } 
     } 
    } 
    finally 
    { 
     _isUpdatingTarget = false; 
    } 
} 

private void ListViewSelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    if (_isUpdatingTarget) 
     return; 

    var selectedItems = this.SelectedItems; 
    if (selectedItems == null) 
     return; 

    try 
    { 
     _isUpdatingSource = true; 

     foreach (var item in e.RemovedItems) 
     { 
      selectedItems.Remove(item); 
     } 

     foreach (var item in e.AddedItems) 
     { 
      selectedItems.Add(item); 
     } 
    } 
    finally 
    { 
     _isUpdatingSource = false; 
    } 
} 

} 

XAML

<ListView ItemsSource="{Binding ItemsList}" 
      DisplayMemberPath="Name" 
      SelectionMode="Extended"> 
     <i:Interaction.Behaviors> 
      <local:MultiSelectionBehavior SelectedItems="{Binding MySelectedItems}" /> 
     </i:Interaction.Behaviors> 
    </ListView> 

MySelectedItems是收集您的視圖模型

不要忘了初始化... MySelectedItems在您的視圖模型....

您的視圖模型

private void ExcludeCurveExecuted(object param) 
{     
    int count = MySelectedItems.Count; 
} 
+0

這看起來有點繁瑣的過程......... – Mohanavel 2012-02-01 10:20:46

+0

@Mohanavel該代碼已經存在,你只需要使用它....是的它會爲你節省大量的同步項目 – Ankesh 2012-02-02 06:57:53