概要:
UserControl
とという名前の2 つの がZone
ありZoneGroup
ます。これらのコントロールの 1 つ ( )ZoneGroup
には、もう 1 つのコントロールの 2 つのインスタンス ( ) が含まれていますZone
。どちらも、イベント ハンドラでDataContext
ルート要素をthis
, に設定します。Loaded
問題は、読み込み前DataContext
に内部コントロール ( s) が設定されている (イベントが の前に発生した) ため、UI で誤動作が発生することです。(内部コントロールの初期状態が間違っています。) それを防ぐと、次のエラー レポートが表示されることを除いて、すべて正常に動作します (少なくとも正常に動作するようです!)。(出力ウィンドウで)Zone
DataContextChanged
Loaded
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 パス エラー: 'ZoneBrush' プロパティが 'object' ''ZoneGroup' (Name='')' に見つかりません。BindingExpression:Path=ZoneBrush; DataItem='ZoneGroup' (Name=''); ターゲット要素は '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;
}
∙∙∙
}
また、2 つのコントロールを格納して管理するためにUserControl
2 つの があるものもあります。ContentPresenter
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 エラーが報告されます。