我有一个自定义类,我的依赖项属性不能用于绑定,除非我将该类声明为静态资源。 我的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}"/>
这不是什么大问题,但我想知道原因。有人知道吗?
答案 0 :(得分:1)
ContentLoader
属性只是期望INavigationContentLoader
的实现。
它不期望收到FrameworkElement
甚至DependencyObject
,它只期望一个普通的旧普通类碰巧实现一个特定的接口。因此,它只引用提供的实例,它不会对它做任何其他事情。
反过来,这意味着当RegionNavigationContentLoader
的实例直接构造并与绑定一起分配时,绑定无法找到DataContext,它对DataContext的搜索就会在RegionNavigationContentLoader
结束,因为它无法找到父母。
另一方面,当您构造实例并将其添加到ResourceDictionary
(这是一个DependencyObject)时,UserControl
又由Frame
拥有,FrameworkElement
具有数据上下文,绑定可以找到它在寻找什么。随后,静态资源将此同一对象分配给DependencyObject
。