1

質問:ユーザーコントロールの「ビューモデル」(.xaml.csファイル)にListViewItemがListViewに追加されたことを知らせる「適切な」方法は何ですか?この投稿は別の問題に対処していることに注意してください。

詳細:

ListViewとDataContextを含むUserControlがあります。

  1. ListViewにはItemsSource={BindingActionLogEntries}があります
  2. ActionLogEntriesは、DataContextのObservableCollectionプロパティです。

データコンテキストは、特定のことが発生したときにリストビューにアイテムを追加します。

ただし、ListView.ItemAddedイベントはありません。データコンテキストのObservableCollectionにCollectionChangedイベントがありますが、このイベントのビューモデルのハンドラーは、アイテムがListViewに追加される前に呼び出される可能性があるため、これは適切な戦略とは思えません。

参考:これは、アイテムがListViewに追加されたときに、新しく追加されたアイテムに自動的にスクロールしないために発生しました。これは、追加する必要のある動作です。その後、おそらくScrollIntoViewを使用します。

4

1 に答える 1

1

したがって、この猫の皮を剥ぐには少なくとも2つの方法があります。

  1. 私の質問へのコメントでクレメンスによって説明されたようにしてください
  2. WPFメンターによるこの投稿のように行う

キャストする必要がないため、ソリューション1はイベントサブスクリプションにとってより自然なようです。また、IntelliSenseは、キャストなしで実装されたインターフェイスのクラスメンバーを表示しないため、ソリューション2では、実装されているインターフェイスを確認し、そこでイベントを確認する必要があります。各ソリューションのサブスクリプションは次のようになります。

protected override void OnInitialized(EventArgs e)
{
    base.OnInitialized(e);

    // Solution 1, subscription:
    xActionListView.ItemContainerGenerator.ItemsChanged +=
        new ItemsChangedEventHandler(ActionLog_ItemsChanged);

    // Solution 2, subscription:
    ((INotifyCollectionChanged)xActionListView.Items).CollectionChanged += 
        new NotifyCollectionChangedEventHandler(ActionListView_CollectionChanged);
}

ただし、ソリューション2では、ハンドラーでイベント引数を使用する方が簡単です。

// Solution 1, handler: 
private void ActionLog_ItemsChanged(object sender, ItemsChangedEventArgs e)
{
    if (e.Action == NotifyCollectionChangedAction.Add)
    {
        // Solution 1, scroll the new item into view  
        xActionListView.ScrollIntoView(
            xActionListView.Items[e.Position.Index + e.Position.Offset]);
    }      
}

// Solution 2, handler: 
private void ActionListView_CollectionChanged(
    object sender, NotifyCollectionChangedEventArgs e)
{
    if (e.Action == NotifyCollectionChangedAction.Add)
    {
        // Solution 2, scroll the new item into view  
        xActionListView.ScrollIntoView(e.NewItems[0]);
    }      
}

状況によっては、一方のソリューションが他方よりも適切であるように見えます。必要なデータに基づいて、イベントデータをどちらか一方で使用する方が簡単な場合があります。

于 2013-02-16T14:07:29.617 に答える