除非我将它作为静态资源,否则依赖属性绑定不适用于类

时间:2011-08-25 19:36:03

标签: c# wpf vb.net silverlight prism

我有一个自定义类,我的依赖项属性不能用于绑定,除非我将该类声明为静态资源。 我的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 个答案:

答案 0 :(得分:1)

ContentLoader属性只是期望INavigationContentLoader的实现。

它不期望收到FrameworkElement甚至DependencyObject,它只期望一个普通的旧普通类碰巧实现一个特定的接口。因此,它只引用提供的实例,它不会对它做任何其他事情。

反过来,这意味着当RegionNavigationContentLoader的实例直接构造并与绑定一起分配时,绑定无法找到DataContext,它对DataContext的搜索就会在RegionNavigationContentLoader结束,因为它无法找到父母。

另一方面,当您构造实例并将其添加到ResourceDictionary(这是一个DependencyObject)时,UserControl又由Frame拥有,FrameworkElement具有数据上下文,绑定可以找到它在寻找什么。随后,静态资源将此同一对象分配给DependencyObject

顺便说一下,你确定你需要{{1}}来{{1}}不要吗?