2011-05-18 44 views

回答

8

就我所知,没有内置的方法可以做到这一点,所以您将不得不编写一些代码。

您可以通过设置SelectionModeMultipleExtended(见here为差)设置你的ListBox为多选,并附着到SelectionChanged事件。当事件发生时,修改选择你认为合适的方式(你如何去做将取决于你希望如何工作......如果他们选择了第三个,它会马上被移除吗?还是第一个获得删除 - 有效的FIFO或LIFO删除)。

编辑:

我的坏,我已经挂了错误的文章。

+0

NB:在WPF中,将SelectionMode枚举[是不同的。](http://msdn.microsoft.com/en-us/library/system.windows.controls.selectionmode.aspx) – 2011-05-18 21:34:51

+0

@djacobson - 哎呦。我的错。感谢您的更正。 – Tim 2011-05-18 21:42:12

+0

事件发生时,程序如何取消选择所选项目? – user983731 2011-11-03 18:47:13

1

以下是如何限制选择两个项目只

对于下面的XAML定义ListView的一个例子

<ListView x:Name="MyListView" ItemsSource="{Binding Path=ParentSection.MyListItems}" BorderThickness="0" 
       SelectionMode="Multiple" ScrollViewer.HorizontalScrollBarVisibility="Hidden" 
       mvvm:FrameworkElementBehaviors.IgnoreMouseWheel="True" 
       SelectionChanged="MyListView_SelectionChanged"> 
    <ListView.View> 
    <!--Your list view content here --> 
    </ListView.View> 
    </ListView> 

事件会像下面

public void MyListView_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     if (this.MyListView.SelectedItems.Count > 2) 
     { 
      this.MyListView.SelectedItems.RemoveAt(0); 
     } 
    } 
+0

感谢这个例子!如果我是OP,我会选择它作为我的解决方案。 – 2015-03-07 16:40:01

1

我做了一个这样的行为,我可以将我想要选择的元素的数量绑定到一个依赖属性。

它这样使用,连接到ListView

<i:Interaction.Behaviors> 
    <behaviors:LimitSelectionBehavior Limit="2" /> 
</i:Interaction.Behaviors> 

这里是行为类。 Remove可以修改为取消选择到Limit,现在它只是取消选择所有新添加的。

public class LimitSelectionBehavior : Behavior<ListView> 
{ 
    public static readonly DependencyProperty LimitProperty; 

    static LimitSelectionBehavior() 
    { 
     LimitProperty = DependencyProperty.Register("Limit", typeof(int), typeof(LimitSelectionBehavior), new PropertyMetadata(default(int))); 
    } 

    public int Limit 
    { 
     get { return (int) GetValue(LimitProperty); } 
     set { SetValue(LimitProperty, value); } 
    } 

    protected override void OnAttached() 
    { 
     base.OnAttached(); 
     AssociatedObject.SelectionChanged += OnSelectionChanged; 
    } 

    protected override void OnDetaching() 
    { 
     base.OnDetaching(); 
     AssociatedObject.SelectionChanged -= OnSelectionChanged; 
    } 

    private void OnSelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     if (AssociatedObject.SelectedItems.Count <= Limit) 
      return; 

     foreach (var added in e.AddedItems) 
     { 
      AssociatedObject.SelectedItems.Remove(added); 
     } 
    } 
} 
相关问题