Ошибка привязки данных WPF: не удается найти источник для привязки со ссылкой 'RelativeSource FindAncestor' - PullRequest
10 голосов
/ 09 октября 2010

Я получаю следующие ошибки из приведенного ниже кода ... не знаю, почему (и да, он выдает все 4, хотя это те же самые 2 повторения). Да, и он не производит эффект чередующихся строк, хотя до появления этих ошибок работал тот же код.

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

Ответы [ 2 ]

7 голосов
/ 11 июля 2011

Это известная ошибка;проверьте http://wpf.codeplex.com/discussions/47047 и http://social.msdn.microsoft.com/Forums/en-GB/wpf/thread/af7cd462-febe-482b-9a04-61b076933c7b для получения более подробной информации.

В первом URL (Codeplex) я собираюсь опубликовать обходной путь;тем не менее, это связано с изменением исходного кода WPF Toolkit.

0 голосов
/ 10 октября 2010

Прежде всего, строки таблицы данных WPF по умолчанию белые, так почему вы устанавливаете их в своем стиле белым? Вы можете полностью избавиться от бита DataGrid.Resources и заменить AlternationCount = 2 на AlternatingRowBackground = "FFCAC6C6" (хотя это приведет к тому, что первая строка будет белой, а вторая - цветной и т. Д. Если это не приемлемо, вы все равно можете удалить триггер, который устанавливает белый фон).

Об ошибках - поскольку предоставленный вами код не содержит привязок с набором RelativeSource, я могу сделать только два вывода:

1) Либо вы не предоставили полный код, и вам нужно пересмотреть свои привязки, в которых есть RelativeSource, поскольку очевидно, что где-то произошла ошибка.

2) Вы не используете встроенную в WPF DataGrid. Возможно, WPF инструментарий DataGrid от codeplex? Хотя я полагаю, что в них также не должно быть этих ошибок, скорее всего, это снова вывод 1.

...