2010-10-08 10 views
9

Otrzymuję następujące błędy z kodu poniżej ... nie wiem dlaczego (i tak, to produkuje wszystkie 4, mimo że jest to ten sam 2 powtórzone). Aha, i nie wytwarza efektu naprzemiennych rzędów, mimo że przed pojawieniem się tych błędów działał ten sam kod.Błąd DataBinding WPF: Nie można znaleźć źródła dla wiązania z odniesieniem "RelativeSource FindAncestor"

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.DataGrid', AncestorLevel='1''. BindingExpression:Path=AreRowDetailsFrozen; DataItem=null; target element is 'DataGridDetailsPresenter' (Name=''); target property is 'SelectiveScrollingOrientation' (type 'SelectiveScrollingOrientation') 
System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.DataGrid', AncestorLevel='1''. BindingExpression:Path=HeadersVisibility; DataItem=null; target element is 'DataGridRowHeader' (Name=''); target property is 'Visibility' (type 'Visibility') 
System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.DataGrid', AncestorLevel='1''. BindingExpression:Path=AreRowDetailsFrozen; DataItem=null; target element is 'DataGridDetailsPresenter' (Name=''); target property is 'SelectiveScrollingOrientation' (type 'SelectiveScrollingOrientation') 
System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.DataGrid', AncestorLevel='1''. BindingExpression:Path=HeadersVisibility; DataItem=null; target element is 'DataGridRowHeader' (Name=''); target property is 'Visibility' (type 'Visibility') 
<UserControl x:Class="MyProject.Views.RegistrationAllView" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:local="clr-namespace:MyProject.Views" 
      > 
    <Grid> 
     <DataGrid Name="TestGrid" Grid.Row="2" Grid.ColumnSpan="2" AutoGenerateColumns="True" 
        ItemsSource="{Binding Registrations}" SelectedValue="{Binding CurrentRegistration}" IsReadOnly="True" GridLinesVisibility="None" 
        AlternatingRowBackground="#FFCAC6C6" 
        > 
      <DataGrid.RowStyle> 
       <Style> 
        <EventSetter Event="DataGridRow.MouseDoubleClick" Handler="TestGrid_MouseDoubleClick" /> 
       </Style> 
      </DataGrid.RowStyle> 
     </DataGrid> 
    </Grid> 
</UserControl> 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 

using MyProject.ViewModels; 

using WPFBase; 
using WPFBase.ViewModels; 

namespace MyProject.Views 
{ 
    public partial class RegistrationAllView : UserControl 
    { 
     public RegistrationAllView() 
     { 
      InitializeComponent(); 
     } 

     private void TestGrid_MouseDoubleClick(object sender, MouseButtonEventArgs e) 
     { 
      DependencyObject source = e.OriginalSource as DependencyObject; 

      RegistrationEntity entity = (RegistrationEntity)TestGrid.CurrentItem; 

      TabControl TabCollection = (TabControl)UIHelper.TryFindParentControl<TabControl>(this); 

      RegistrationForm view = new RegistrationForm(); 

      XTabItem tabItem = new XTabItem(); 
      tabItem.Header = String.Format("Registration (#{0})", entity.ID); 
      tabItem.Content = view; 

      TabCollection.Items.Add(tabItem); 

      tabItem.Focus(); 

      AbstractViewModel vm = new RegistrationViewModel(entity); 

      view.DataContext = vm; 
     } 
    } 
} 
+0

Gdzie jest 'DataTemplate' dla obiektów w twoim' ItemsSource'? –

+0

@Robert Rossney: Ustawiłem to na AutoGenerateColumns, więc naprawdę nie potrzebuję DataTemplate. –

Odpowiedz

0

pierwsze rzędy WPF DataGrid są białe domyślnie więc dlaczego ustawiając je biały w stylu? Możesz całkowicie pozbyć się bitu DataGrid.Resources i zastąpić AlternationCount = 2 alternatywnymRowBackground = "FFCAC6C6" (chociaż spowoduje to, że pierwszy wiersz będzie biały, a drugi będzie kolorowy itd. Jeśli to nie jest dopuszczalne, możesz nadal usuwać spust, który ustawia białe tło).

O błędów - od kodu swoją przewidzianym nie zawiera żadnych powiązań z zestawem RelativeSource, mogę stwierdzić tylko dwie rzeczy:

1) albo nie dawały pełny kod i trzeba relook swojej Wiązania, które mają w sobie RelativeSource, ponieważ wyraźnie jest gdzieś błąd.

2) Nie używasz wbudowanej wtyczki WPF do DataGrid. Być może zestaw narzędzi WPF DataGrid z codeplex? Chociaż uważam, że nie powinien on również zawierać tych błędów, bardziej prawdopodobny jest wniosek 1.

+0

Opublikowałem cały kod, ale naprawdę nie było wiele do dodania. Wprowadziłem zmiany do AlternatingRowBackground zgodnie z sugestią i działa dobrze i jest bardziej skondensowane. Nadal dostaję błędy, chociaż tak naprawdę nie wpływają one na funkcjonalność lub wyświetlacz. Och, i używam wbudowanego Datagridu (nie tego z pakietu WPF Toolkit). –

+0

Musi być trochę kodu, który ma powiązanie z trybem wyszukiwania przodka. 1) Być może niektóre klasy w xmlns: local = "clr-namespace: MyProject.Views"? 2) Lub jakiś szablon jest gdzieś zmieniany ... 3) Jeśli usuniesz powiązania ItemsSource i SelectedValue z datagridu, czy błędy znikną? 4) Wydaje mi się, że powinno być gdzieś daleko, aby zgłosić chęć popełnienia błędu związanego ze zbieraniem danych, google, a być może dostaniesz więcej wskazówek, gdzie te błędy są zgłaszane. 5) Ponieważ jest to kontrola użytkownika, której nie można debugować na własną rękę, może błędy pochodzą z okna hostingu? – Marko

7

To znany błąd; sprawdź: http://wpf.codeplex.com/discussions/47047 i http://social.msdn.microsoft.com/Forums/en-GB/wpf/thread/af7cd462-febe-482b-9a04-61b076933c7b, aby uzyskać więcej informacji.

W pierwszym adresie URL (Codeplex) zamierzam opublikować obejście; wymaga to jednak modyfikacji kodu źródłowego narzędzia WPF Toolkit.

+0

Świetny link, dzięki. Ponieważ włamywanie do WPF nie wchodzi w grę w moim przypadku, dziewiąty post z góry> "Jedyną poprawką jaką znalazłem jest ustawienie HeadersVisibility =" All "i RowHeaderWidth =" 0 "." było dla mnie preferowanym rozwiązaniem. – Barton

Powiązane problemy