2012-04-03 6 views
1

Я использую ObservableCollection как ItemSource для моего ListBox компонента:WPF ListBox Прокрутка к нижним

Но поведение контроля не является правильным, как для меня. Дело в том, что у меня есть прокрутка вниз до первого появления в моей коллекции, но не последняя.

Список выборки: 1,1,2,3,4,5,6,7,8,9,11,22,33,1

Когда вы enetr последний 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(); 
     } 
    } 

} 
+0

У вас есть и ObservableCollection ? Если ваш последний элемент - 33, он работает? Если так, то что делает, это равное сравнение с ListItems. Попробуйте List , так как это может вести себя по-другому. Если нет, то вам нужно привязать к настраиваемому классу, где вы реализуете GetHashCode и переопределяете Equals, так что первый первый не равен предыдущему 1. – Paparazzi

+0

Да, если 33 это хорошо работает, потому что раньше не было 33 в коллекции. Я должен использовать ObservableCollection для соответствия изменениям источника данных. Жаль, что привязана к пользовательскому классу вообще :( – alerya

ответ

2

Извините, но это должен быть класс как Список или 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

+0

Thing hash должен быть Int32. Поэтому, если вы можете пройти уникальный Int32, вы собираетесь получите немного более быстрый код. И я уверен, что вам нужно переопределить GetHashCode, если вы собираетесь переопределить Equals, но я не уверен. Я один из тех, кто заставляет людей быстро. – Paparazzi

+0

Это решение iw работает отлично! – alerya

Смежные вопросы