【发布时间】:2021-10-27 17:47:23
【问题描述】:
我有以下 XAML...
<TabControl Grid.Row="0" Grid.Column="1" Grid.RowSpan="2"
Name="customerTab"
ItemsSource="{ Binding DetailViewModels }"
SelectedItem="{Binding SelectedDetailViewModel, Mode=TwoWay}"
TabStripPlacement="Top">
<TabControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Title}" />
<TextBlock Text="*" Visibility="{Binding HasChanges, Converter={StaticResource BooleanToVisibilityConverter}}" />
<Button Command="{Binding CloseCommand}" Style="{StaticResource closeButtonStyle}" />
</StackPanel>
</DataTemplate>
</TabControl.ItemTemplate>
</TabControl>
基本上,我有一个列表视图,我可以在其中单击记录以查看详细信息。详细记录显示在选项卡控件中。
您可以看到我有一个按钮,该按钮绑定到关闭选项卡的命令。
当我关闭选项卡时,显示以下绑定错误...
System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.TabControl', AncestorLevel='1''. BindingExpression:Path=TabStripPlacement; DataItem=null; target element is 'TabItem' (Name=''); target property is 'NoTarget' (type 'Object')
我不完全确定这个问题。这是否意味着细节视图模型在关闭时无法爬回层次结构到选项卡控件?
实际的应用程序按设计工作,我只是想解决这个错误,这样它就不会在我每次关闭标签时都出现。
CloseCommand 是一个委托命令。这是该代码及其运行的方法。
public DelegateCommand CloseCommand { get; private set; }
CloseCommand = new DelegateCommand(OnClose);
public void OnClose()
{
OnTabClosed?.Invoke(InstanceId);
}
OnTabClosed 是关闭选项卡的操作,InstanceId 只是详细视图模型的 GUID。
我确实在网上搜索并找到了隐藏消息的方法,但我不愿意这样做,因为害怕隐藏更多合法的绑定错误。
我该如何解决这个问题?最好的调试方法是什么?
编辑 这是处理标签项关闭的代码...
private void HandleTabClosed(Guid instanceId)
{
DetailViewModels.Remove(DetailViewModels.First(vm => vm.InstanceId == instanceId));
}
【问题讨论】:
-
如果我理解,您不是关闭 TabControl,而是关闭 TabItems 之一?你能显示关闭 TabItem 的代码吗?那么,你能说你在哪个绑定上有错误吗?
-
我添加了处理标签项关闭的代码。它所做的只是删除细节视图模型。