2013-01-19 11 views
17

moja aplikacja będzie rzucać ten komunikat o błędzie, gdy dodałem nową kartę, a następnie usunięty go:Nie można odnaleźć źródła dla wiązania

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

Nie skarżą się, jeśli dodałem nową kartę, przełączany na inną kartę, wrócił, a następnie usunął go. Wydawało się, że coś zostało "zaktualizowane" podczas przełączania, ale nie mogłem dowiedzieć się, co i jak je naprawić.

To jest mój plik 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> 

I to jest moje kody dodawanie/usuwanie zakładek:

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

Daj mi znać, jeśli chcesz zobaczyć więcej kodów. Z góry dziękuję.

+1

Nikt nie chce mi pomóc ...? – user1447343

+0

Prawdopodobnie nikt nie wie, jak Ci pomóc, Google nie znajdzie prawie nic o tym ostrzeżeniu. Właśnie trafiłem na ten sam problem i opublikowałem analizę poniżej. Nie ma obejścia, z wyjątkiem zastąpienia domyślnego stylu. – Zarat

Odpowiedz

7

To nie jest błąd, tylko trochę hałasu pochodzącego z silnika wiążącego WPF, gdy aktualizuje wiązania i zauważa, że ​​coś poszło. To niefortunne, że nie można go uciszyć. Może warto go zgłaszać na forach Connect lub MSDN, ale nie spodziewaj się szybkich reakcji.

Zauważona wiadomość pochodzi z aero2.normalcolor.xaml - domyślnych stylów dla systemu Windows 8. Jeśli zainstalowałeś VS 2012 SP 2 w domyślnej lokalizacji, możesz je znaleźć tutaj: C: \ Program Files (x86) \ Microsoft Visual Studio 11.0 \ Blend \ SystemThemes \ Wpf

W tym pliku znajduje się kilka MultiDataTriggers z warunkami do sprawdzenia TabStripPlacement przez RelativeSource, szukając rodzica TabControl. Tak więc po usunięciu TabItem z TabControl możliwe jest, że silnik wiązania próbuje zaktualizować powiązanie i znajdzie brakujące urządzenie macierzyste, rejestrując ostrzeżenie. To jest całkiem ok, odkąd TabItem został usunięty i nie interesują Cię już style (gdyby dodać je ponownie, wiązanie byłoby ponownie ocenione i wszystko byłoby w porządku).

Teraz nie wiem, dlaczego pobierają TabStripPlacement przez RelativeSource dla Windows 8, ponieważ sam TabItem wydaje się posiadać kopię swoich rodziców TabStripPlacement. Wszystkie inne domyślne style używają lokalnej kopii TabStripPlacement dla ich powiązań. Więc jeśli czujesz się na siłach, możesz chcieć skopiować styl do własnego słownika zasobów i użyć "ustalonej" wersji podczas debugowania, aby zmniejszyć szum ...

12

Jako że Zarat wspomniał, że domyślny styl TabItem w Windows 8 ma wyzwalacze strzelaj po usunięciu, a następnie poszukaj brakującego TabControl. Uważam, że błąd, ponieważ dodawanie i usuwanie TabItems jest naprawdę powszechnym scenariuszem, prawda?

znalazłem jako obejście, że jest możliwe, aby usunąć szablon z 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); 
} 

który wygląda ok w moim scenariuszu, bo nie użyje TabItem więcej.

Próbowałem również wyczyścić kolekcję wyzwalaczy szablonu lub usunąć kolekcję conditons jego wyzwalaczy, ale nie wolno tego robić (błędy).
Również nie wydaje się, że sposób wyłączania wyzwalaczy jest tot.

+1

Dziękujemy! To poprawiło mój humor.Nigdy więcej ostrzeżeń po ustawieniu 'Template = null' tuż przed usunięciem karty. –

+1

Niestety, moje elementy tabulacji są powiązane z danymi do widoku modelu za pomocą Caliburn :( – willem

+0

Kudos. Ta odpowiedź zajęła mi wiele lat, ale jest tak prosta i skuteczna. –

Powiązane problemy