DataGrid の itemssource を TreeView にバインドしようとしています。TreeView に表示されるアイテムをリストにフラット化するコンバーターがあります。
私はtreegridviewを書き込もうとしています.DataGridがTreeViewに現在表示されている行を表示するように、TreeViewとDataGridを隣り合わせに配置するという考えです。この質問のように。
コンバーターは正常に動作しているように見えますが、私の問題はバインディングをトリガーして更新する方法です。イベントと折りたたまれたイベントを試しましたTreeViewItem.Expanded="UpdateDataGrid"
が、コンテナーが生成される前に発生するため、ノードが初めて展開されたときに機能しません。
これにはどのようなイベントが適していますか?
誰かが興味を持っている場合のコンバーターのコード:
class TreeViewChildrenConverter :IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var treeView = (TreeView) value;
var allItemContainers = GetAllItemContainers(treeView);
return allItemContainers.Select(x => x.DataContext);
}
private IEnumerable<TreeViewItem> GetAllItemContainers(ItemsControl itemsControl)
{
for (int i = 0; i < itemsControl.Items.Count; i++)
{
var containerFromIndex = itemsControl.ItemContainerGenerator.ContainerFromIndex(i);
var childItemContainer = containerFromIndex as TreeViewItem;
if (childItemContainer != null)
{
yield return childItemContainer;
if (childItemContainer.IsExpanded)
{
foreach (var treeViewItem in GetAllItemContainers(childItemContainer))
{
yield return treeViewItem;
}
}
}
}
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}