2013-01-19 19 views
17

La mia applicazione getterebbe questo messaggio di errore quando ho aggiunto una nuova scheda e quindi eliminato:Non riesci a trovare fonte per il legame

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

Non si lamentava se ho aggiunto una nuova scheda, passato ad un'altra scheda, passato indietro, e poi cancellato. Sembrava che qualcosa fosse "aggiornato" durante gli switch, ma non riuscivo a capire cosa e come risolverli.

Questo è il mio file 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> 

E questo è il mio codice per l'aggiunta di schede/eliminazione:

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

Fammi sapere se hai bisogno di vedere più codici. Grazie in anticipo.

+1

Nessuno mi vuole aiutare ...? – user1447343

+0

Probabilmente nessuno sa come aiutarti, google non trova quasi nulla su questo avviso. Ho appena raggiunto lo stesso problema e pubblicato un'analisi di seguito. Non c'è soluzione alternativa tranne la sostituzione dello stile di default offendente. – Zarat

risposta

7

Non è un bug, solo un po 'di rumore proveniente dal motore di associazione WPF quando aggiorna i collegamenti e nota che qualcosa è andato perso. È un peccato che non possa essere messo a tacere. Forse vale la pena di riferire su Connect o sui forum MSDN, ma non aspettatevi reazioni veloci.

Il messaggio che hai notato proviene da aero2.normalcolor.xaml - gli stili predefiniti per Windows 8. Se hai installato VS 2012 SP 2 nella posizione predefinita, puoi trovarli qui: C: \ Programmi (x86) \ Microsoft Visual Studio 11.0 \ Blend \ SystemThemes \ Wpf

In questo file sono presenti alcuni MultiDataTrigger con condizioni per controllare TabStripPlacement su RelativeSource, cercando il padre TabControl. Pertanto, quando si rimuove TabItem da TabControl è possibile che il motore di associazione tenti di aggiornare l'associazione e trova mancante il genitore, registrando un avviso. Questo è tutto ok visto che il TabItem è stato rimosso e non ti interessa più gli stili (se dovessi aggiungerlo di nuovo, i binding verrebbero rivalutati e anche tutto sarebbe a posto).

Ora non so perché recuperano TabStripPlacement su RelativeSource per Windows 8, poiché lo stesso TabItem sembra trasportare una copia dei suoi genitori TabStripPlacement. Tutti gli altri stili di default usano quella copia locale di TabStripPlacement per i loro collegamenti. Quindi, se ti senti avventuroso potresti voler copiare lo stile nel tuo dizionario delle risorse e usare una versione "fissa" durante il debug per ridurre il rumore ...

12

Come Zarat menzionato lo stile predefinito per TabItem in Windows 8 ha trigger che sparare dopo la rimozione e quindi cercare il TabControl ora mancante. Considero un bug perché aggiungere e rimuovere TabItems è uno scenario molto comune, vero?

ho trovato come una soluzione, che è possibile rimuovere il modello del 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); 
} 

Che sembra ok nel mio scenario, perché non voglio usare il TabItem più.

Ho anche provato a cancellare la raccolta di trigger del modello o a cancellare la raccolta di conditoni dei suoi trigger, ma non è consentito farlo (errori).
Inoltre, non sembra esserci un modo per disabilitare i trigger.

+1

Grazie! Mi ha cambiato la giornata in positivo.Niente più avvisi dopo aver impostato 'Template = null' prima di rimuovere la scheda. –

+1

Sfortunatamente i miei elementi di tabulazione sono associati a dati a viewModel utilizzando Caliburn :( – willem

+0

Complimenti. Questa risposta mi ha portato a trovare anni ma è così semplice ed efficace. –

Problemi correlati