【问题标题】:WPF ListBox Scroll to the bottomWPF ListBox 滚动到底部
【发布时间】:2012-04-03 19:15:29
【问题描述】:

我使用 ObservableCollection 作为我的 listBox 组件的 ItemSource:

但是控件的行为对我来说不合适。我已经向下滚动到我收藏中第一次出现的问题,但不是最后一次。

样本列表为:1,1,2,3,4,5,6,7,8,9,11,22,33,1

当您进入最后一个 1 时,您的组件向上滚动到第一个 1 :)。这不是我想要的。

请指教。这里是组件的代码:

public class MyListBox : ListBox
{
    protected override void OnItemsChanged(System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {
        base.OnItemsChanged(e);
        if (Items.Count > 0)
        {
            var item = Items[Items.Count - 1];
            UpdateLayout();
            ScrollIntoView(item);
            UpdateLayout();
        }
    }

}

【问题讨论】:

  • 你有 ObservableCollection?如果您的最后一项是 33,它可以工作吗?如果是这样,正在做的是对 ListItems 进行相等比较。尝试 List 因为它的行为可能不同。如果不是,那么您需要绑定到您实现 GetHashCode 并覆盖 Equals 的自定义类,以便第一个 1 不等于最后一个 1。
  • 是的,如果 33 这很好用,因为之前没有 33 在集合中。我必须使用 ObservableCollection 来满足数据源的变化。可惜完全绑定到自定义类:(

标签: wpf scroll listbox-control


【解决方案1】:

抱歉,它必须是一个类,否则 OC 将真正进行值比较。因此,您需要使相同的值唯一。我对此进行了测试,并且可以正常工作。

     <StackPanel Orientation="Vertical" >
        <ListBox x:Name="lbStringList" ItemsSource="{Binding Path=UniqueStringList}" DisplayMemberPath="Str" Height="60" VerticalAlignment="Top"/>
        <Button Click="Button_Click" Content="56" />
     </StackPanel>


    private List<UniqueString> uniqueStringList = new List<UniqueString>() 
            {                   
                new UniqueString("zero",0),
                new UniqueString("one",1),
                new UniqueString("two",2),
                new UniqueString("three",3),
                new UniqueString("four",4),
                new UniqueString("five",5),
                new UniqueString("six",6),
                new UniqueString("seven",7),
                new UniqueString("zero",8)
            }; 

    public MainWindow()
    {
        InitializeComponent();

    }
    public List<string> StringList { get { return new List<string>() { "one", "two", "three", "four", "five", "one" }; } }
    public List<UniqueString> UniqueStringList 
    { 
        get 
        {
            return uniqueStringList;
        } 
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        System.Diagnostics.Debug.WriteLine(sender.GetHashCode());
        lbStringList.ScrollIntoView(lbStringList.Items[8]);

    }
    public class UniqueString
    {
        private Int32 id;
        public string Str { get; private set; }
        public override bool Equals(object obj)
        {
            UniqueString item = (UniqueString)obj;
            return item.id == id;
        }
        public override int GetHashCode()
        {
            return id;
        }

        public UniqueString(string str, Int32 _id) { Str = str; id = _id; }
    }

【讨论】:

  • 看起来不错。但是使用 dateStamp 而不是 int ID 来避免不必要的参数也不错。
  • 哈希必须是 Int32。因此,如果您可以传递唯一的 Int32,您将获得更快的代码。如果你要覆盖 Equals,我很确定你必须覆盖 GetHashCode,但我不确定。我就是其中之一。
猜你喜欢
  • 2012-02-06
  • 2013-07-22
  • 1970-01-01
  • 1970-01-01
  • 2020-09-24
  • 1970-01-01
  • 2021-07-25
  • 2011-01-21
相关资源
最近更新 更多