2012-04-03 126 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