Использование Unity в пользовательских элементах управления WPF - PullRequest
0 голосов
/ 13 октября 2010

Я пытаюсь создать пользовательский элемент управления WPF, который содержит ссылку на контейнер единиц, созданный в BootStrapper - например,

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

До сих пор я создал свой пользовательский элемент управления и включил в файл кода следующее свойство зависимости

public static readonly DependencyProperty ContainerProperty = DependencyProperty.Register("Container", typeof(UnityContainer), typeof(SomeCustomWPFControl), new PropertyMetadata("DefaultTestValue"));

    public UnityContainer Container
    {
        get { return (UnityContainer)GetValue(ContainerProperty); }
        set { SetValue(ContainerProperty, value); }
    }

В форме WPF, где я пытаюсь включить свой пользовательский элемент управления, я добавил следующую строку в область ресурсов:

<Unity:UnityContainer x:Key="unitContainer"></Unity:UnityContainer>

В той форме, в которой я сам пытался создать пользовательский элемент управления:

<Globe:SomeCustomWPFControl Container="{DynamicResource unitContainer}" DockPanel.Dock="Right" x:Name="JimEditor1" Grid.Column="0" Grid.Row="3"></Globe:SomeCustomWPFControl>

Единственная информация об ошибке, которую я получаю во время выполнения, это

Ошибка в объекте 'System.Windows.Controls.Grid' в файле разметки '[имя сборки]; [путь / файл] .xaml' Строка 135, позиция 22.

Любые предложения относительно того, где я иду не так? Thx.

Полный Xaml:

<UserControl x:Class="DB.GPF.Globe.Views.JimTestPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:Globe="clr-namespace:DB.GPF.Globe" 
xmlns:Unity="clr-namespace:Microsoft.Practices.Unity;assembly=Microsoft.Practices.Unity">
<UserControl.Resources>
    <Unity:UnityContainer x:Key="unitContainer"></Unity:UnityContainer>
</UserControl.Resources>
<Grid>
    <Globe:SomeCustomWPFControl Container="{DynamicResource unitContainer}" x:Name="JImTestControl1"></Globe:SomeCustomWPFControl>
</Grid>

Обновление. Похоже, проблема в наличии свойства DependencyProperty типа UnityContainer или IUnityContainer, если тип изменен на встроенный тип .Net, например, Строка тогда работает нормально. Есть идеи, почему у нас не может быть DependencyProperty типа UnityContainer или IUnityContainer?

Ответы [ 2 ]

1 голос
/ 13 октября 2010

Я думаю, что встраивать Unity в пользовательский контроль не очень хорошая идея.

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

0 голосов
/ 13 октября 2010
<Globe:SomeCustomWPFControlContainer="{DynamicResource unitContainer}" DockPanel.Dock="Right" x:Name="JimEditor1" Grid.Column="0" Grid.Row="3"></Globe:SomeCustomWPFControlContainer>

Существует проблема в вашем xaml сразу после <Globe:SomeCustomWPFControlContainer. Вам не хватает свойства для привязки.

РЕДАКТИРОВАТЬ: ваш получить значение также неверно. У вас есть GetValue (GetValue (ContextMenuProperty)), и он должен быть ...

public UnityContainer Container
{
    get { return (UnityContainer)GetValue(ContainerProperty); }
    set { SetValue(ContainerProperty, value); }
}
...