Как связать с коллекцией, содержащейся в другом проекте / пространстве имен? - PullRequest
1 голос
/ 26 мая 2009

я сделал это:

this.combobox.ItemsSource = Common.Component.ModuleManager.Instance.Modules;

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

Теперь мне нужно сделать что-то подобное:

<ComboBox ItemsSource="{Binding Common.Component.ModuleManager.Instance.Modules}"/>

Я не хочу перечислять все свои попытки, но ни одна не была успешной.
Есть идеи получше?

Ответы [ 3 ]

3 голосов
/ 26 мая 2009

Вам необходимо сопоставить пространство имен .NET с пространством имен XML в верхней части файла XAML:

<Window 
    x:Class="WindowsApplication1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:q="clr-namespace:Common.Component">

Так что теперь "q" сопоставлено с пространством имен "Common.Component". Теперь вы можете использовать расширение разметки x: Static для доступа к статическому свойству "Instance" вашего класса ModuleManager:

<ComboBox
    ItemsSource="{Binding Modules,Source={x:Static q:ModuleManager.Instance}}" />

Посмотрите, работает ли это для вас.

Редактировать

Еще одна вещь: если ваше пространство имен «Common.Component» находится в отдельной сборке, вам нужно сообщить XAML, что:

xmlns:q="clr-namespace:Common.Component;assembly=CommonAssemblyFilename"
0 голосов
/ 26 мая 2009

Хорошо, я нашел обходной путь. Должна быть проблема, если коллекция содержится в другой сборке.

Я добавил новый класс в сборку XAML и Binding.

public static class ResourceHelper
{
    public static IEnumerable<Common.Component.Module> Modules = Common.Component.ModuleManager.Instance.Modules;
}

Затем я изменил привязку на

<ComboBox ItemsSource="{Binding Path=.,Source={x:Static e:ResourceHelper.Modules}}"/>

И это прекрасно работает.
Спасибо Мэтту за помощь.

0 голосов
/ 26 мая 2009

На несвязанной заметке вы можете привязать коллекцию Observable вместо производительности. Подробнее об оптимизации WPF здесь .

Привязка IEnumerable к ItemsControl заставляет WPF создавать объект-оболочку IList <(Of <(T>)>), что означает, что на производительность влияют ненужные издержки второго объекта.

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