2013-02-15 42 views
1

問:什麼是讓用戶控件的「視圖模型」(.xaml.cs文件)知道ListViewItem已添加到ListView的「正確」方法?請注意,this post解決了一個不同的問題。WPF ListView與ItemsSource:如何知道模型何時添加項目

詳細說明:

我已經含有ListView和一個DataContext一個用戶控件:

  1. 的ListView中具有的ItemsSource = {結合ActionLogEntries}
  2. ActionLogEntries是在DataContext
  3. 一個ObservableCollection屬性

當某些事情發生時,數據上下文將項添加到ListView。

但是沒有ListView.ItemAdded事件。在數據上下文中的ObservableCollection上有一個CollectionChanged事件,但該事件的視圖模型的處理程序可能在該項目被添加到ListView之前被調用,所以這看起來不是一個好策略。

僅供參考:因爲當項目添加到ListView時,它不會自動滾動到新添加的項目,這是我必須添加的行爲。據推測,之後我會使用ScrollIntoView。

+1

如何處理ListView的[ItemContainerGenerator](http:/ /)的[ItemsChanged](http://msdn.microsoft.com/en-us/library/system.windows.controls.itemcontainergenerator.itemschanged.aspx) /msdn.microsoft.com/en-us/library/system.windows.controls.itemscontrol.itemcontainergenerator.aspx)?也許還太早... – Clemens 2013-02-15 19:16:51

+0

這似乎工作。但是,事件arg有點奇怪:e.Position是一個位置生成器,具有Index和Offset屬性,如果您對添加的最新元素感興趣,您似乎必須添加索引+偏移量。以下更多細節。 – Schollii 2013-02-16 13:53:27

回答

1

所以有剝皮這隻貓至少有兩種方式:

  1. 也由克萊門斯在評論解釋了我的問題
  2. 請在this post by WPF Mentor

解決方案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具有更易於使用事件中的arg處理程序:

// 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]); 
    }  
} 

它看起來像在某些情況下,一種解決方案可能更合適比另一個更重要:根據您需要的數據,事件數據可能更容易在一個或另一箇中使用。

相關問題