2009-07-21 1 views
5

У меня есть DataTemplate, который я использую как CellTemplate для GridViewColumn.WPF не позволит мне привязать привязку к пути привязки - есть ли другой способ?

Я хочу написать что-то вроде этого для DataTemplate:

<DataTemplate 
    x:Key="_myTemplate"> 
    <TextBlock 
     Text="{Binding Path={Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type GridViewColumn}}, Path=Header}}" /> 
</DataTemplate> 

Моего GridView привязан к DataTable, и я хочу, чтобы привязать к колонку DataTable, имя которого равно заголовке GridViewColumnDataTemplate прилагается. [Я надеюсь, что это имело смысл!]

К сожалению, это не работает. Я получаю исключение XamlParseException: «A Binding» не может быть задано в свойстве «Path» типа «Binding». «Связывание» может быть установлено только на DependencyProperty объекта DependenceyObject ».

Как я могу настроить это?

Редактировать (подъемная комментарий по даН.м. на вопрос)

Я в основном нужен DataTemplate связывание которого определяется DataContext и какой колонка DataTemplate прилагается к. Есть ли альтернатива?

+0

Не знаю, почему вы добавили это, как SilverLight RelativeSource не поддерживается в Silverlight – AnthonyWJones

+0

К сожалению об этом, Энтони. Я не знал, что Silverlight не поддерживает RelativeSource. Я не женат на использовании RelativeSource, поэтому, если есть решение XAML по моему вопросу, которое его не использует, мне все равно будет интересно его услышать. – devuxer

ответ

0

Вы не можете назначить привязку только к любому свойству. Свойство должно быть либо типа Binding, либо быть реализовано как свойство зависимостей объекта.

Свойство Path класса Binding имеет тип PropertyPath и Binding не реализует свойство Path как свойство зависимости. Следовательно, вы не можете динамически связывать Path так, как вы пытаетесь.

Редактировать

Вы в основном хотите вставлять метаданные в ваших занных данных, который приводит конфигурацию DataTemplate. Это невозможно сделать только в XAML. Вам потребуется хотя бы некоторая поддержка кода.

Мне кажется, что наилучшим подходом было бы использовать ViewModel. Это делает привязку в XAML прямолинейной и подталкивает это «что связать с каким» решением в код ViewModel.

+0

Спасибо, но мой вопрос в том, есть ли другой способ выполнить мою цель с помощью XAML. Мне в основном нужен DataTemplate, привязка которого определяется DataContext * и *, к которому прикреплен DataTemplate. Есть ли альтернатива? – devuxer

+0

@ Энтони, Thx для вашего редактирования. Мой вопрос фактически возник из обсуждения того, как показывать сводные данные в GridView, где количество столбцов и связанных путей привязки неизвестно до тех пор, пока база данных не будет запрашиваться во время выполнения. Я использую MVVM и имею ViewModel, но моим первоначальным решением было динамическое создание DataTemplates в коде с помощью XamlReader.Load(). Это было резко критиковали как «нехорошо» (см. Http: // stackoverflow.com/questions/1156336/is-it-possible-to-configure-a-gridview-to-show-pivoted-data-using-static-xaml-if), поэтому моя попытка более гибкого DataTemplate. – devuxer

+1

@Anothony (продолжение), поэтому мой DataContext установлен в мою модель ViewModel, а элемент ItemsSource для GridView установлен в свойство ViewModel (DataTable), но, я думаю, я не понимаю, как ViewModel может решить проблему того, как чтобы сопоставить каждую GridViewColumn с правильным столбцом DataTable, не прибегая к динамически загружаемому XAML. – devuxer

0

Разве вы не хотите этого?

{Binding Path=Header, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type GridViewColumn}}} 
+0

Я верю, что то, что у вас здесь, приведет к тому, что текстовое поле каждой отдельной ячейки в столбце будет таким же, как и заголовок. Я хочу привязать GridViewColumn к соответствующему DataColumn DataTable, где имена столбцов в DataTable соответствуют значению заголовка GridViewColumns. Итак, если заголовок для GridViewColumn был «Column3», этот столбец будет привязан к столбцу с именем «Column3» в DataTable. Я надеюсь, что это имеет смысл :) – devuxer

+0

Я думаю, что у вас будут проблемы с этим, как вы пытаетесь, поскольку GridViews основаны на строках, т. Е. Ячейка - это ребенок или строка, а не столбец. Попробуйте взглянуть на эту серию сообщений от доктора WPF, это может помочь устранить некоторую путаницу: http://drwpf.com/blog/ItemsControlSeries/tabid/59/Default.aspx. Основное правило для WPF, если вы пытаетесь использовать что-то таким образом, чтобы оно не предназначалось для вещей, будет невероятно трудным, но обычно у них есть простой способ сделать это уже сделано. Это найти простой способ, это сложная часть ... –

+0

@Bryan Я посмотрю, спасибо! – devuxer

 Смежные вопросы

  • Нет связанных вопросов^_^