抽象的:
我有两个UserControl
名为Zone
和ZoneGroup
。这些控件之一 ( ZoneGroup
) 包括另一个 ( Zone
) 的两个实例。他们都DataContext
将根元素设置为this
, 在Loaded
事件处理程序中。
问题是DataContext
内部控件(Zone
s)是在加载之前设置的(DataContextChanged
事件发生在之前Loaded
),这会导致 UI 出现一些故障。(内部Zone
控件的初始状态是错误的。)如果我阻止它,一切正常(至少看起来是!)除了我遇到以下错误报告。(在输出窗口中)
public partial class Zone : UserControl
{
∙∙∙
private void Zone_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
{
// Adding this if-clause solve UI problems but makes some binding errors!
if (this.IsLoaded)
brdRoot.DataContext = this;
}
}
System.Windows.Data 错误:40:BindingExpression 路径错误:在“对象”“ZoneGroup”(名称=“”)上找不到“ZoneBrush”属性。绑定表达式:路径=ZoneBrush;DataItem='ZoneGroup'(名称='');目标元素是 'brdRoot' (Name=''); 目标属性是“BorderBrush”(输入“Brush”)
细节:
有一个包含几个数据绑定的UserControl
命名Zone
,像这样..
<UserControl x:Class="MyApp.Zone"
∙∙∙>
<Border x:Name="brdRoot" BorderBrush="{Binding ZoneBrush}" BorderThickness="1">
∙∙∙
</Border>
</UserControl>
所以,我将brdRoot
数据上下文设置为
public partial class Zone : UserControl
{
public Brush ZoneBrush
{
get { return (Brush)GetValue(ZoneBrushProperty); }
set { SetValue(ZoneBrushProperty, value); }
}
∙∙∙
public Zone()
{
InitializeComponent();
}
private void Zone_Loaded(object sender, RoutedEventArgs e)
{
brdRoot.DataContext = this;
}
∙∙∙
}
此外,还有一个UserControl
有两个ContentPresenter
s 以包含和管理两个Zone
控件。
<UserControl x:Class="MyApp.ZoneGroup"
∙∙∙>
<Border x:Name="brdRoot" BorderBrush="Gray" BorderThickness="1">
<StackPanel Orientation="Horizontal">
<ContentPresenter Content="{Binding MainZone}"
Margin="{Binding MainZonePadding}"/>
<ContentPresenter Content="{Binding MemberZone}"/>
</StackPanel>
</Border>
</UserControl>
背后的代码是:
public partial class ZoneGroup : UserControl
{
public Thickness MainZonePadding
{
get { return (Thickness)GetValue(MainZonePaddingProperty); }
set { SetValue(MainZonePaddingProperty, value); }
}
public Zone MainZone
{
get { return (Zone)GetValue(MainZoneProperty); }
set { SetValue(MainZoneProperty, value); }
}
public Zone MemberZone
{
get { return (Zone)GetValue(MemberZoneProperty); }
set { SetValue(MemberZoneProperty, value); }
}
public ZoneGroup()
{
InitializeComponent();
}
private void ZoneGroup_Loaded(object sender, RoutedEventArgs e)
{
brdRoot.DataContext = this;
}
∙∙∙
}
编辑 ►草图:
我的应用程序按预期工作正常,但报告了一些 BindingExpression 错误。