いくつかのコントロールを備えたウィンドウがあり、それらは必然的に相互にviewModelsを参照します。関連するコントロールのグループをカスタムUserControlに移動したいのですが、移動すると、ウィンドウ内の他のコントロールから現在埋め込まれているコントロールへのバインドに問題があります。
たとえば、私のウィンドウにはグリッドがあります。グリッドの1つのセルに、2つのカスタムUserControlを含むStackPanelがあります。
<StackPanel>
<KtWpf:TicketGridControl x:Name="ticketGrid" />
<KtWpf:TicketViewControl x:Name="ticketView" />
</StackPanel>
グリッドの別のセルに、グリッド内の現在のアイテムにバインドする別のカスタムUserControlがあります。
<local:AddressView x:Name="addressView"
currentItem="{Binding ElementName=ticketGrid,Path=viewModel.tickets.CurrentItem}" />
そして、そのバインディングは正常に機能します。
しかし、私が欲しいのは、ticketGridとticketViewを新しいカスタムUserControlに移動することです。これは簡単に実行できます。
<UserControl
x:Class="KorEnterprise.EnterpriseMobile.MyTickets"
...
>
<StackPanel>
<KtWpf:TicketGridControl x:Name="ticketGrid" />
<KtWpf:TicketViewControl x:Name="ticketViewControl" />
</StackPanel>
</UserControl>
次に、グリッドで、StackPanelを次のように置き換えます。
<local:MyTickets x:Name="myTickets" />
そして、addressViewのバインディングが次のように変更されることを期待します。
<local:AddressView x:Name="addressView"
currentItem="{Binding ElementName=myTickets,Path=ticketGrid.viewModel.tickets.CurrentItem}" />
しかし、これは機能しません。実行時にBindingExpressionエラーが発生します。
System.Windows.Data Error: 40 :
BindingExpression path error: 'ticketGrid' property not found on 'object' ''MyTickets' (Name='myTickets')'.
BindingExpression:Path=ticketGrid.viewModel.tickets.CurrentItem;
DataItem='MyTickets' (Name='myTickets');
target element is 'AddressView' (Name='addressView');
target property is 'currentItem' (type 'TicketVM')
そして、その理由がわかりません。コンパイル時にエラーは発生しません。コードにエラーは発生しません。
たとえば、これは例外をスローしません。
public MainWindow()
{
...
this.applicationExiting += new ApplicationExitingEventHandler(this.myTickets.ticketGrid.applicationExitingEventHandler);
...
}
デバッガーをウォークスルーすると、this.myTicketsが存在し、this.myTickets.ticketGridが存在し、イベントハンドラーが正常に接続されます。
しかし、XAMLがサイレントマジックを開始し、バインディングをフックすると、何らかの理由でthis.myTickets.ticketGridが存在しなくなります。
そして、私はその理由を理解するのに途方に暮れています。