2012-04-03 86 views
1

我使用的ObservableCollection作为我的ListBox组件的的ItemSource:WPF列表框滚动至底部

但控制的行为不是适当的给我。我已经向下滚动到我收藏中的第一次发生,但不是最后一次。

样品名单是:1,1,2,3,4,5,6,7,8,9,11,22,33,1

当你enetr最后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(); 
     } 
    } 

} 
+0

You have and ObservableCollection ?如果你的最后一个项目是33是否有效?如果是这样,那么对ListItems进行相等比较。尝试列表,因为它可能会有不同的表现。如果不是,那么你需要绑定到一个自定义的类,在那里你实现GetHashCode并且覆盖Equals,所以第一个1不等于最后的1. – Paparazzi 2012-04-03 19:42:35

+0

是的,如果33这样工作的很好,因为在集合之前没有33。我必须使用ObservableCollection来满足数据源的更改。它可惜绑定到自定义类的所有:( – alerya 2012-04-03 19:56:06

回答

2

对不起,但它需要是一个类作为List或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; } 
    } 
+0

看起来不错,但使用dateStamp而不是int ID来避免不必要的参数。 – alerya 2012-04-03 20:49:20

+0

事情是散列必须是Int32。所以如果你可以通过独特的Int32你将要得到一个更快的代码,而且我敢肯定你必须重写GetHashCode,如果你打算重写Equals,但我不确定,我就是其中之一,让它变成快速的人 – Paparazzi 2012-04-03 20:57:25

+0

这个解决方案工作的很好,谢谢。 – alerya 2012-04-05 05:32:49