代码之家  ›  专栏  ›  技术社区  ›  Dabblernl

如何确保没有在数据绑定列表框中选择任何项?

  •  4
  • Dabblernl  · 技术社区  · 15 年前

    好吧,这肯定是一个重复的问题,但我找不到答案: 我有一个数据绑定到集合的列表框。默认情况下,选择项目[0]。如何防止这种情况,以确保每次单击ListBoxItem时都引发SelectionChanged事件?

    编辑: 我已经取消了selectedIndex=-1路由,但我再试了一次:在列表框的构造函数中将selectedIndex设置为-1(或在XAML中设置为属性)不起作用。似乎列表框是在初始化后填充的,selectedIndex最终将变为0。同样的情况是将selectedItem设置为空;

    我试过这个:

    <ListBox ItemsSource="{Binding Value}" 
             SelectionChanged="ListBox_SelectionChanged"
             IsSynchronizedWithCurrentItem="True"
             Loaded="ListBox_Loaded">
    </ListBox>
    

    用:

     private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if(e.AddedItems.Count==0)return;//Prevents stackoverflow! ;-)
            ((ListBox)e.OriginalSource).SelectedItem=null;
        }
    
    private void ListBox_Loaded(object sender, RoutedEventArgs e)
    {
        ((ListBox) sender).SelectedItem = null;
    }
    

    这是可行的,但它在列表框显示的项的顶部插入一个空行,这非常难看…… 在我的特定案例中,我可以通过删除isSynchronizedWithCurrentItem属性来解决这个问题。

    但我可以想到许多情况,在这些情况下,这是不可接受的。

    上面的语句是胡说八道的:要么你想使用主细节绑定并将IsSynchronizedWithCurrentItem设置为true,要么你不想。你不太可能想使用主细节绑定,然后在列表框中没有当前选中的项。 总是

    6 回复  |  直到 12 年前
        1
  •  2
  •   Stanislav Kniazev    15 年前

    将CollectionView用作列表框的项源。一个最初没有选择任何项的新WPF项目:

    XAML:

    <Window x:Class="ListBoxDataBinding.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <Grid>
        <ListBox 
            ItemsSource="{Binding Path=Value, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}}" 
            SelectionChanged="ListBox_SelectionChanged"
            IsSynchronizedWithCurrentItem="True"
            >
        </ListBox>
    </Grid>
    </Window>
    

    反恐精英:

    public partial class Window1: Window {
        public IEnumerable Value {
            get { return (IEnumerable)GetValue(ValueProperty); }
            set { SetValue(ValueProperty, value); }
        }
    
        public static readonly DependencyProperty ValueProperty =
            DependencyProperty.Register("Value", typeof(IEnumerable), typeof(Window1), new UIPropertyMetadata(null));
    
    
        public Window1() {
            InitializeComponent();
            var view = new TheCollectionView();
            view.MoveCurrentTo(null);
            this.Value = view;
        }
    
        private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e) {
            MessageBox.Show("Selection changed");
        }
    }
    
    public class TheCollectionView: CollectionView {
        public TheCollectionView(): base(new TheCollection()) {
        }
    }
    
    public class TheCollection: List<string> {
        public TheCollection() {
            Add("string1");
            Add("string2");
            Add("string3");
        }
    }
    
        2
  •  6
  •   James Hay    15 年前

    如果将IsSynchronizedWithCurrentItem设置为true,则表示SelectedIndex始终等于ListBox.items.CurrentItem的索引。ListBox.items总是有一个currentItem,不能设置为-1或空,因为currentItem或currentIndex是只读的。

    希望有所帮助 J

    编辑…刚刚读过

    “在我的特定情况下,我可以通过删除isSynchronizedWithCurrentItem属性来解决这个问题。但我可以想到许多情况,在这些情况下,这是不可接受的。”

    在这种情况下,我认为由于上述原因是不可能的。

        3
  •  2
  •   MoominTroll    15 年前
    listbox.selectedIndex = -1
    

    这应该取消选择所有内容(因为索引-1不存在),但据我所知,除非显式设置默认的selectedItem,否则生成列表视图时未选择任何内容,因此可能在某个时刻无意中设置了selectedIndex。注意,selectedIndex也可以在XAML中设置。

        4
  •  1
  •   t0mm13b    15 年前

    您需要将索引设置为-1,这会告诉列表框不要选择任何内容。在SelectionChanged事件中,将列表框的Index属性设置为-1。

    希望这有帮助, 最好的问候, 汤姆。

        5
  •  1
  •   Danny Varod    15 年前

    如何转储SelectionChanged事件处理程序并将依赖属性绑定到数据,或者将属性通知给SelectedValue?

        6
  •  0
  •   Oscar Fraxedas    12 年前

    您可以使用tap事件而不是selectionchanged:

    <ListBox  ItemsSource="{Binding Data}" Tap="ListBox_Tap" ... />
    
    推荐文章