1

listBoxコンポーネントのItemSourceとしてObservableCollectionを使用しています。

しかし、コントロールの動作は私にとって適切ではありません。私が持っている問題は、私のコレクションの最初の出現までスクロールダウンしますが、最後ではありません。

サンプルリストは次のとおりです: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();
        }
    }

}
4

1 に答える 1

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; }
    }
于 2012-04-03T20:27:40.843 に答える