Привязки свойств зависимостей не работают для класса, если я не сделаю его статическим ресурсом - PullRequest
1 голос
/ 25 августа 2011

У меня есть собственный класс, и мои свойства зависимостей не будут работать с привязками, если я не объявлю класс как статический ресурс. Мой xaml:

<sdk:Frame prism:RegionManager.RegionName="MainContentRegion">
    <sdk:Frame.ContentLoader>
        <myLibrary:RegionNavigationContentLoader
            RegionManager="{Binding RegionManager}"
            RegionName="MainContentRegion" />
    </sdk:Frame.ContentLoader>
</sdk:Frame>

Мой класс загрузчика:

public class RegionNavigationContentLoader : FrameworkElement, INavigationContentLoader
{

    public static readonly DependencyProperty RegionManagerProperty = DependencyProperty.Register("RegionManager", typeof(IRegionManager), typeof(RegionNavigationContentLoader), new PropertyMetadata(null));
    public IRegionManager RegionManager {
        get { return (IRegionManager)GetValue(RegionManagerProperty); }
        set { SetValue(RegionManagerProperty, value); }
    }

    public static readonly DependencyProperty RegionNameProperty = DependencyProperty.Register("RegionName", typeof(string), typeof(RegionNavigationContentLoader), new PropertyMetadata(null));
    public string RegionName {
        get { return (string)GetValue(RegionNameProperty); }
        set { SetValue(RegionNameProperty, value); }
    }

    ...
}

Однако он работает нормально, когда я объявляю загрузчик ресурсом, а затем передаю его как статическую привязку ресурса к фрейму.

<Grid.Resources>
    <myLibrary:RegionNavigationContentLoader x:Key="RegionLoader"
        RegionManager="{Binding RegionManager}"
        RegionName="MainContentRegion" />
</Grid.Resources>

<sdk:Frame prism:RegionManager.RegionName="MainContentRegion"
    ContentLoader="{StaticResource RegionLoader}"/>

Это не имеет большого значения, но я хочу знать почему. Кто-нибудь знает?

1 Ответ

1 голос
/ 26 августа 2011

Свойство ContentLoader просто ожидает реализацию fo INavigationContentLoader.

Он не ожидает получения FrameworkElement или даже DependencyObject, он ожидает только простой старый обычный класс, который реализует определенный интерфейс.В результате он просто ссылается на предоставленный экземпляр, он больше ничего с ним не делает.

В свою очередь это означает, что когда экземпляр вашего RegionNavigationContentLoader напрямую создается и назначается вместе с вашей привязкой, привязка не может найти DataContextего поиск DataContext заканчивается тут же на RegionNavigationContentLoader, потому что он не может найти родителя.

С другой стороны, когда вы создаете свой экземпляр и добавляете его в ResourceDictionary (который является DependencyObject) который в свою очередь принадлежит UserControl, у которого есть контекст данных, привязка может найти то, что ищет.Этот же объект впоследствии присваивается статическому ресурсу Frame.

Кстати, вы уверены, что вам нужно извлечь из FrameworkElement, что DependencyObject не подойдет?

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