当我添加一个新标签然后删除它时,我的应用程序会抛出以下错误消息:
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')
如果我添加一个新标签,切换到另一个标签,切换回来,然后删除它,它不会抱怨。看起来像是在切换过程中“更新”了一些东西,但我不知道是什么以及如何修复它们。
这是我的xaml文件:
<Window x:Class="MyHomework__MVVM_.MyHomeworkView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="My Homework" Height="450" Width="800" ResizeMode="CanMinimize">
<Grid Margin="0,0,10,10">
<TabControl HorizontalAlignment="Left" Height="330" VerticalAlignment="Top" Width="764" Margin="10,10,0,0" ItemsSource="{Binding AllTabs}" SelectedItem="{Binding SelectedTab}">
<TabControl.ItemContainerStyle>
<Style TargetType="TabItem">
<Setter Property="Header" Value="{Binding Header}"/>
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<Grid>
<TextBox Text="{Binding Text, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" FontSize="16" AcceptsReturn="True" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" TextChanged="OnTextChanged">
</TextBox>
</Grid>
</DataTemplate>
</Setter.Value>
</Setter>
<Setter Property="FontSize" Value="20"/>
</Style>
</TabControl.ItemContainerStyle>
</TabControl>
<Button Content="Add Course" HorizontalAlignment="Left" VerticalAlignment="Top" Width="105" Margin="10,351,0,0" Height="50" Command="{Binding AddCourseCommand}"/>
<Button Content="Drop Course" HorizontalAlignment="Left" VerticalAlignment="Top" Width="76" Margin="126,379,0,0" Height="22" Command="{Binding DropCourseCommand, UpdateSourceTrigger=PropertyChanged}"/>
<Button Content="Save HW" HorizontalAlignment="Left" VerticalAlignment="Top" Width="105" Margin="669,351,0,0" Height="50" Command="{Binding SaveHomeworkCommand, UpdateSourceTrigger=PropertyChanged}"/>
</Grid>
</Window>
这是我添加/删除标签的代码:
public void AddNewTab()
{
NewCourseName ncn = new NewCourseName();
ncn.Owner = mainWindow;
ncn.ShowDialog();
if (ncn.courseName != null)
{
MyHomeworkModel newTab = new MyHomeworkModel();
newTab.Header = ncn.courseName;
newTab.Text = "";
AllTabs.Add(newTab);
SelectedTab = newTab;
}
}
public void RemoveTab()
{
DropCourseConfirmation dcc = new DropCourseConfirmation();
dcc.Owner = mainWindow;
dcc.ShowDialog();
if (dcc.drop == true)
{
int index = AllTabs.IndexOf(SelectedTab);
AllTabs.Remove(SelectedTab);
if (AllTabs.Count > 0)
{
if (index == 0)
{
SelectedTab = AllTabs[0];
}
else
{
SelectedTab = AllTabs[--index];
}
}
else
{
SelectedTab = null;
}
}
}
如果你想看更多代码,请告诉我。先谢谢你了。
4条答案
按热度按时间pdsfdshx1#
正如Zarat所提到的,Windows 8中TabItem的默认样式有触发器,这些触发器会在移除之后触发,然后寻找现在丢失的TabControl。我认为这是一个bug,因为添加和删除TabItems是一个非常常见的场景,不是吗?
我发现作为一种解决方法,可以删除TabItem的模板:
这在我的场景中看起来没问题,因为我将不再使用TabItem。
我还尝试清除模板的触发器集合或清除其触发器的conditons集合,但不允许这样做(错误)。
而且似乎没有办法禁用触发器。
wnavrhmk2#
这不是一个bug,只是WPF绑定引擎在更新绑定时发出一些噪音,并注意到丢失了一些东西。不幸的是,它不能沉默。也许值得在Connect或MSDN论坛上报告,但不要期望任何快速React。
您注意到的消息来自aero2.normalcolor.xaml -Windows 8的默认样式。如果你在默认位置安装了VS 2012 SP 2,你可以在这里找到它们:C:\Program Files(x86)\Microsoft Visual Studio 11.0\Blend\SystemThemes\Wpf
在这个文件中有几个MultiDataTrigger,它们的条件是检查RelativeSource上的TabStripPlacement,查找父TabControl。因此,当您从TabControl中删除TabItem时,绑定引擎可能会尝试更新绑定,但发现父项丢失,并记录一个警告。这是完全可以的,因为TabItem被删除了,你不再关心样式(如果你要再次添加它,绑定将被重新评估,一切都会很好)。
现在我不知道为什么他们在Windows 8的RelativeSource上检索TabStripPlacement,因为TabItem本身似乎携带了其父TabStripPlacement的副本。所有其他默认样式都使用TabStripPlacement的本地副本进行绑定。因此,如果您觉得冒险,您可能希望将样式复制到自己的资源字典中,并在调试期间使用“固定”版本以减少噪音……
vdzxcuhz3#
我相信这是最终的修复,它将在XAML级别工作(没有代码),应该对每个人都有效。
在您的TabControl中添加此 ItemContainerStyle
并将此 Style 和此 ControlTemplate 添加到您的窗口/应用资源
nkoocmlb4#
我有一个类似的问题,我把我的样式放在app.xaml文件,并照顾它,我不再得到那些绑定错误。希望能帮上忙。