2013-01-19 8 views
17

Mon application jetterait ce message d'erreur lorsque j'ai ajouté un nouvel onglet, puis supprimé:Vous ne trouvez pas la source pour la liaison

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') 

Il ne se plaignait pas si j'ajouté un nouvel onglet, passer à un autre onglet, reculé, puis supprimé. Semblait comme si quelque chose était "mis à jour" pendant les commutateurs, mais je ne pouvais pas comprendre quoi et comment les réparer.

Ceci est mon fichier 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> 

Et voici mes codes pour ajouter/onglets: suppression

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; 
       } 
      } 
     } 

Laissez-moi savoir si vous avez besoin pour plus de codes. Merci d'avance.

+1

Personne ne veut m'aider ...? – user1447343

+0

Probablement personne ne sait comment vous aider, Google ne trouve presque rien sur cet avertissement. J'ai juste frappé le même problème et posté une analyse ci-dessous. Il n'y a pas de solution de rechange, sauf le remplacement du style par défaut offensant. – Zarat

Répondre

7

Ce n'est pas un bogue, juste un peu de bruit provenant du moteur de liaison WPF lorsqu'il met à jour les liaisons et remarque que quelque chose a disparu. Il est regrettable que cela ne puisse pas être réduit au silence. Peut-être que cela vaut la peine de signaler sur Connect ou les forums MSDN, mais ne vous attendez pas à des réactions rapides. Le message que vous avez remarqué provient de aero2.normalcolor.xaml - les styles par défaut pour Windows 8. Si vous avez installé VS 2012 SP 2 dans l'emplacement par défaut, vous pouvez les trouver ici: C: \ Program Files (x86) \ Microsoft Visual Studio 11.0 \ Blend \ SystemThemes \ Wpf

Dans ce fichier sont quelques MultiDataTrigger avec des conditions pour vérifier TabStripPlacement sur un RelativeSource, à la recherche de la TabControl parent. Ainsi, lorsque vous supprimez un TabItem du TabControl, il est possible que le moteur de liaison essaie de mettre à jour la liaison et trouve le parent manquant, enregistrant un avertissement. C'est tout à fait correct puisque le TabItem a été enlevé et vous ne vous souciez plus des styles (si vous deviez l'ajouter à nouveau, les fixations seraient réévaluées et tout irait bien, aussi). Maintenant je ne sais pas pourquoi ils récupèrent le TabStripPlacement sur un RelativeSource pour Windows 8, puisque le TabItem lui-même semble porter une copie de ses parents TabStripPlacement. Tous les autres styles par défaut utilisent cette copie locale de TabStripPlacement pour leurs liaisons. Donc, si vous vous sentez aventureux, vous pouvez copier le style dans votre propre dictionnaire de ressources et utiliser une version "fixe" pendant le débogage pour réduire le bruit ...

12

Comme le Zarat mentionné le style par défaut pour TabItem dans Windows 8 a des déclencheurs que feu après la suppression et ensuite chercher le TabControl maintenant manquant. Je considère qu'un bug parce que l'ajout et la suppression de TabItems est un scénario très commun n'est-ce pas?

J'ai trouvé comme solution de contournement, qu'il est possible de supprimer le modèle du TabItem:

foreach (var item in TabControl.Items) 
{ 
    var tabitem = item as TabItem; 
    // if this is the item to remove 
    tabitem.Template = null; 
    TabControl.Items.Remove(item); 
} 

Cela semble ok dans mon scénario, parce que je ne vais pas utiliser le TabItem plus.

J'ai également essayé d'effacer la collection de triggers du modèle ou d'effacer la collection de conditions de ses triggers, mais cela n'est pas autorisé (erreurs).
De plus, il ne semble pas y avoir moyen de désactiver les déclencheurs.

+1

Merci! Cela a fait ma journée.Plus d'avertissement après avoir défini 'Template = null' juste avant de supprimer l'onglet. –

+1

Malheureusement, mes éléments de l'onglet sont liés à un viewModel utilisant Caliburn :( – willem

+0

Kudos.Cette réponse m'a pris des âges à trouver, mais est si simple et efficace. –

Questions connexes