2013-01-19 70 views
17

我的應用程序時,我添加了一個新的標籤將拋出此錯誤消息,找到源,然後將其刪除:不能綁定

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

讓我知道你是否需要看到更多的代碼。提前致謝。

+1

沒有人想幫助我......? – user1447343

+0

也許沒有人知道如何幫助你,谷歌幾乎找不到這個警告。我只是遇到了同樣的問題,並在下面發佈了分析。除了替換違規的默認樣式外,沒有解決方法。 – Zarat

回答

7

這不是一個錯誤,只是當WPF綁定引擎更新綁定並發現某些內容丟失時,會有一些噪音。不幸的是,它不能保持沉默。也許它值得在Connect或MSDN論壇上報道,但不要期待任何快速反應。

您注意到的消息來自aero2.normalcolor.xaml - Windows 8的默認樣式。如果您將VS 2012 SP 2安裝在默認位置,您可以在以下位置找到它們:C:\ Program Files(x86)\ Microsoft Visual Studio 11.0 \ Blend \ SystemThemes \ Wpf

在這個文件中有幾個MultiDataTriggers,其條件是通過RelativeSource檢查TabStripPlacement,查找父級TabControl。因此,當您從TabControl中刪除TabItem時,綁定引擎可能會嘗試更新綁定並找到父項缺失,並記錄警告。這完全沒問題,因爲TabItem被刪除,你不再關心樣式(如果你再次添加它,綁定將被重新評估,一切都會好起來的)。

現在我不知道爲什麼他們檢索TabStripPlacement對於Windows 8的RelativeSource,因爲TabItem本身似乎攜帶其父母TabStripPlacement的副本。所有其他默認樣式都使用TabStripPlacement的本地副本作爲綁定。所以,如果你覺得喜歡冒險,你可能想複製風格到自己的資源字典,並在調試過程中使用「固定」版本,以減少噪音...

12

由於Zarat提到Windows 8中的TabItem的默認樣式具有觸發器刪除後,然後查找現在丟失的TabControl。我認爲一個bug是因爲添加和刪除TabItems是一個非常常見的情況,不是嗎?

我發現作爲一種解決方法,它可以去除的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); 
} 

這看起來在我的情況好了,因爲我不會用的TabItem了。

我也嘗試清除模板的觸發器集合或清除其觸發器的conditons集合,但不允許這樣做(錯誤)。
也似乎沒有辦法禁用觸發器。

+1

謝謝!這件事情讓我感到很快樂。在刪除選項卡之前設置'Template = null'後,再沒有警告。 –

+1

不幸的是我的標籤項目是使用Caliburn數據綁定到視圖模型:( – willem

+0

榮譽。這個答案花了我很長時間才找到,但是如此簡單而有效。 –