【发布时间】:2012-10-15 16:24:40
【问题描述】:
我有一个带有许多控件的窗口,它们必须相互引用彼此的视图模型。我想将一组相关控件移动到自定义 UserControl 中,但当我从窗口中的其他控件绑定到现在嵌入的控件时遇到问题。
例如在我的窗口中,我有一个网格。在 Grid 的一个单元格中,我有 StackPanel,其中包含两个自定义 UserControl:
<StackPanel>
<KtWpf:TicketGridControl x:Name="ticketGrid" />
<KtWpf:TicketViewControl x:Name="ticketView" />
</StackPanel>
在网格的另一个单元格中,我有另一个自定义用户控件,它绑定到网格中的当前项:
<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 不存在。
我不知道为什么。
【问题讨论】:
-
尝试:ElementName=myTickets.tickets 我不确定它是否有效,但值得一试
-
给出一个不同的错误:“找不到与引用'ElementName = myTickets.ticketGrid'绑定的源” - 这是我所期望的。