c # wpf: динамический импорт стилей типов элементов Listview - PullRequest
1 голос
/ 18 октября 2019

Ситуация: у меня есть список, отображающий различные объекты, которые все реализуют интерфейс.
Стилизация выполняется <DataTemplate DataType="{x:Type local:MyClass}"> Все работает отлично. Объекты разных классов воспроизводятся, как и предполагалось.

Теперь я создал библиотеку, которая добавляет новый класс, реализующий интерфейс сверху. Кроме того, он предоставляет собственный DataTemplate для отображения в списке. Который находится в библиотеках App.xaml.

После добавления нового класса в список он не распознает предоставленный DataTemplate из библиотеки. Отображается только «namespace.classname».

Как я могу сказать Listbox, чтобы он распознал новый стиль для нового класса (или других неизвестных классов, реализующих только интерфейс?)

Ответы [ 2 ]

1 голос
/ 18 октября 2019

Как я могу сказать Listbox распознать новый стиль для нового класса?

Путем добавления неявного DataTemplate для нового класса, как вы это делали дляMyClass:

<ListBox x:Name="lb">
    <ListBox.Resources>
        <DataTemplate DataType="{x:Type local:MyClass}">
            <TextBlock>My Class...</TextBlock>
        </DataTemplate>
        <DataTemplate DataType="{x:Type local:MyClass2}">
            <TextBlock>My Class 2...</TextBlock>
        </DataTemplate>
    </ListBox.Resources>
</ListBox>

public interface MyInterface { }
public class MyClass : MyInterface { }
public class MyClass2 : MyInterface { }
public class MyClass3 : MyInterface { }
...
lb.ItemsSource = new List<MyInterface> { new MyClass(), new MyClass(), new MyClass2(), new MyClass3() };

... или другие неизвестные классы, реализующие только интерфейс?

Использование неявного DataTemplate длятип интерфейса, подобный этому, не поддерживается:

<DataTemplate DataType="{x:Type local:MyInterface}">
    <TextBlock>won't be applied to MyClass3 objects...</TextBlock>
</DataTemplate>

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

Это означает, чточто вам придется определить другой шаблон для MyClass3.

0 голосов
/ 21 октября 2019

Я нашел следующие шаги для решения проблемы.

Сначала во внешнем проекте Plugin.dll:

  • создайте новый RessourceDictionary в отдельном файле. Я назвал его StyleDictionary.xaml

    <ResourceDictionary ...>
        <DataTemplate DataType="{x:Type local:MyNewClass}"> ... 
        </DataTemplate> 
    </ResourceDictionary>

  • Импортировать Ressource из библиотеки DLL в коде основных приложений, стоящем за
    ResourceDictionary dictionary = new ResourceDictionary();
    dictionary.Source = new Uri("/AssemblynameWithoutDLL;component/StyleDictionary.xaml", UriKind.RelativeOrAbsolute);
    Application.Current.Resources.MergedDictionaries.Add(dictionary);

После этого этоправильно отображается в списке. Теперь я могу динамически загружать сборки (например, из каталога плагинов) и создавать некоторые объекты, которые отображаются по назначению. Классы сборок должны реализовывать мой интерфейс, который будет идентифицирован, и должен быть прочитан «StyleDictionary.xaml».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...