ListViewに追加されたListViewItemがありますが、どのListViewに追加されているのかわかりません。ListViewItemからListViewを取得する方法は?
ListViewItemを使用して、アイテム自体からListViewを取得したいと考えています。
私はParentプロパティを使用しようとしましたが、なんらかの理由でStackPanelを返します。
アイデア?
ListViewに追加されたListViewItemがありますが、どのListViewに追加されているのかわかりません。ListViewItemからListViewを取得する方法は?
ListViewItemを使用して、アイテム自体からListViewを取得したいと考えています。
私はParentプロパティを使用しようとしましたが、なんらかの理由でStackPanelを返します。
アイデア?
私は実行するためにこれを得て、作業しました:
private void Window_Loaded(object s, RoutedEventArgs args)
{
var collectionview = CollectionViewSource.GetDefaultView(this.listview.Items);
collectionview.CollectionChanged += (sender, e) =>
{
if (e.NewItems != null && e.NewItems.Count > 0)
{
var added = e.NewItems[0];
ListViewItem item = added as ListViewItem;
ListView parent = FindParent<ListView>(item);
}
};
}
public static T FindParent<T>(FrameworkElement element) where T : FrameworkElement
{
FrameworkElement parent = LogicalTreeHelper.GetParent(element) as FrameworkElement;
while (parent != null)
{
T correctlyTyped = parent as T;
if (correctlyTyped != null)
return correctlyTyped;
else
return FindParent<T>(parent);
}
return null;
}
これはかなり古い質問ですが、それはWinRTのためにWinRTの
のために動作しません、あなたはビジュアルツリーをトラバースする必要がありますListViewItemからListViewを見つけるためにLogicalTreeHelperの代わりにVisualTreeHelperを使用する
+1他人を助けるかもしれない。 –
私は既に提案されたアプローチとは異なるアプローチを使用しています。
リストビューコントロール(2つまたは3つ)がほんの一足なので、以下のことができます。
ListViewItem listViewItem = e.OriginalSource as ListViewItem;
if (listViewItem == null)
{
...
}
else
{
if (firstListView.ItemContainerGenerator.IndexFromContainer(listViewItem) >= 0)
{
...
}
else if (secondListView.ItemContainerGenerator.IndexFromContainer(listViewItem) >= 0)
{
...
}
}
これは、foreachループではなくのListViewItemの親のListViewを探して、その後を反復処理するために、リストビューコントロールの何百もある場合に使用することができる(他の回答のほとんどが示唆される)おそらくより効率的です。しかし、私のソリューションはよりクリーナーであると思います。誰かを助けることを願っています!
ListView listView = ItemsControl.ItemsControlFromItemContainer(listViewItem) as ListView;
MVVMではそのような問題はありません。 – vorrtex
それはこれと関係があったように... –