C # / WPF / Caliburn.Micro - Combobox ItemsTemplate привязка к свойству анонимного типа - PullRequest
0 голосов
/ 10 февраля 2019

Справочная информация. Я использую C #, WPF и Calburn.Micro для создания GUI-ориентированного приложения с предопределенным набором полиморфных объектов, достигаемых подклассами, унаследованными от абстрактного родительского класса.

Пользователь создает экземпляры различных подклассов, используя форму, которая содержит поле со списком, чтобы выбрать, какой класс создавать экземпляром (также предполагается, что Combobox SelectedItem инициирует изменения содержимого формы в соответствии со свойствами выбранного типа).

Мне удалось перенести все наследуемые подклассы в коллекцию BindableCollection с помощью:

    private void LoadSubClasses()
    {
        Type _parentClass = typeof(ParentClass);
        Assembly assembly = Assembly.GetExecutingAssembly();
        Type[] _types = assembly.GetTypes();

        IEnumerable<Type> SubClassesIEnumerable = _types.Where(t => t.IsSubclassOf(_parentClass));

        foreach (var _subclass in SubClassesIEnumberable)
        {
            SubClassesColletion.Add(_subclass);
        }
    }

    private BindableCollection<Type> _subClassesCollection = new BindableCollection<Type>();
    public BindableCollection<Type> SubClassesCollection
    {
        get { return _subClassesCollection; }
        set { _subClassesCollection = value; }
    }

Во время выполнения я могу видеть комбинированный список, заполненный пустыми элементами (и различными коллекциями в отладчике), что делает меня непонятнымэто пока так хорошо.

Как я уже говорил ранее, часть содержимого формы будет меняться в соответствии с SelectedItem Combobox, поэтому я думаю, что правильное направление - это чтобы тип Combobox был типом, изатем свяжите различные элементы со свойствами выбранного типа.Я пытаюсь реализовать это с помощью ItemsTempalte, начиная с «Селектора подкласса», отображающего абстрактное свойство (называемое «ViewName»), которое переопределяется всеми подклассами:

        <ComboBox x:Name="SubClassesCollection" Height="23" Margin="5,0,5,0">
        <ComboBox.ItemTemplate>
            <DataTemplate>
                <Label Content="{Binding Path=ViewName}"  Margin="-5"/>
            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox>

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

1 Ответ

0 голосов
/ 10 февраля 2019

Моя проблема решена.Я вернул его к методу LoadSubClasses, который заполнил IEnumerable, и полностью изменил его для:

        public void LoadSubClasses()
    {
        IEnumerable<ParentClass> subClassesIEnumerable = typeof(ParentClass)
            .Assembly.GetTypes()
            .Where(t => t.IsSubclassOf(typeof(ParentClass)))
            .Select(t => (ParentClass)Activator.CreateInstance(t));

        foreach (ParentClass _subClass in subClassesIEnumerable)
        {
            _subClassesCollection.Add(_subClass);
        }
    }

    private BindableCollection<ParentClass> _subClassesCollection = new BindableCollection<ParentClass>();
    public BindableCollection<ParentClass> SubClassesCollection
    {
        get { return _subClassesCollection; }
        set { _subClassesCollection = value; NotifyOfPropertyChange(() => SubClassesCollection); }
    }

Исправьте меня, если я ошибаюсь, но я считаю, что моя первая попытка вернула system.runtimetypes в IEnumerable, которые были неработоспособны длямне.Новый код LINQ возвращает созданный экземпляр объекта для каждого подкласса, который может быть помещен в BindableCollection (вместо BindableCollection), и привязка данных работает отлично.

Подсказки для парней, которые ответили здесь: Getвсе унаследованные классы абстрактного класса

...