Связывание и доступ к динамическому списку списков / списков в caliburn.micro - PullRequest
2 голосов
/ 22 ноября 2011

Я использую Caliburn Micro MVVM.Я хочу сделать выбор категории пользовательским контролем, состоящим из нескольких динамических выпадающих списков (или списков), основанных на общей коллекции деревьев.Пользователь должен выбрать любой листовой узел из дерева категорий, поэтому новые коллекции будут появляться до тех пор, пока у выбранного узла есть дочерние элементы под ним.Глубина может варьироваться.

Я хочу, чтобы это выглядело так: http://i.imgur.com/c2uzv.png

... и пока это выглядит так:

CategorySelectorModel.cs:

public BindableCollection<BindableCollection<Category>> Comboboxes { get; set; }

CategorySelector.xaml :

<ItemsControl x:Name="Comboboxes">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <ComboBox ItemsSource="{Binding}" DisplayMemberPath="Name"/>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

Итак, у меня вопрос: можно ли указатьсобытие для каждого созданного выпадающего списка и доступ к его свойству SelectedItem?

1 Ответ

1 голос
/ 29 ноября 2011

Это было проще, чем я ожидал.Мой вопрос был довольно неудачным с этой точки зрения.Я начал с этого:

<ComboBox ItemsSource="{Binding}" DisplayMemberPath="Name" cal:Message.Attach="CategoryChanged($this.SelectedItem)"/>

Каждый узел моего дерева категорий имеет свойство Depth.Поскольку глубина последнего выбранного элемента связана с количеством коллекций, я просто использовал это свойство для удаления всех ненужных коллекций при изменении любого выбранного элемента.

public void CategoryChanged(object selected)
{
    int depth = 0;
    var newcombobox = new BindableCollection<Category>();
    foreach (var node in _tree.All.Nodes)
    {
        if (node.Data.Equals(selected))
        {
            foreach (var category in node.DirectChildren.Values)
            {
                newcombobox.Add(category);
            }
            depth = node.Depth;
        }
    }
    if (newcombobox.Count > 0)
    {
        Comboboxes.Add(newcombobox);
    }
    RemoveFollowing(Comboboxes, depth);
}
...