2013-07-25 5 views
1

собственности Foo в моем DataContextПривязать к DataContext собственности из в DataGridColumn

ViewModel { 
    Visibility Foo; 
} 


Но я не могу понять, как получить доступ к Foo внутри Column. В этом случае, я полагаю, что это, вероятно, ищет Foo в какой бы объект привязан к DataGridItemsSource

<DataGrid Visibility="{Binding Foo}">      // works 
    <DataGrid.Columns> 
     <DataGridTextColumn Visibility="{Binding Foo}" /> // fails 


Я попытался

Binding="{Binding DataContext.Foo}" 

и куча вещей с RelativeSource тегов, а также.


Кроме того, есть ли способ просмотреть и выбрать свойство для привязки к графическому интерфейсу?

Редактировать: Оказывается, что сами столбцы не являются элементами FrameworkElements, поэтому они не могут найти предка DataGrid. Однако вы можете использовать технику в ответе ниже, чтобы связать свойства CellTemplate столбца с DataContext.

+0

Можете ли вы уточнить, что вы подразумеваете под «select a property to bind»? Или, по крайней мере, какой желаемый эффект? – tHand

+0

Мне было интересно, есть ли способ просмотра и выбора элементов из say, treeview, вместо того, чтобы помнить, как писать все теги Path/RelativeSource/DataContext/etc. – Matt

+0

Я согласен, что вы можете использовать привязку RelativeSource в Adi's ответьте на «CellTemplate» ... если вам нравится это решение, я думаю, вы должны опубликовать его как решение и пометить его как ответ, так как код Adi не работает без ключевого положения использования «CellTemplate». Кто-то, просматривая этот вопрос, может разумно взглянуть на отмеченный «ответ» и предположить, что он работает, не читая ваши комментарии об обратном. Я добавил метод привязки видимости столбца, а не скрывает ячейки с помощью «CellTemplate». – TCC

ответ

3

Это должно работать:

<DataGridTextColumn Visibility="{Binding Path=DataContext.Foo, RelativeSource={RelativeSource AncestorType=DataGrid}}" /> 

Вы правы в столбце привязки к текущему элементу - вот почему вам нужно использовать RelativeSource, чтобы получить DataGrid, а затем получить доступ к Foo собственности в его DataContext ,

Что касается выбора свойства для привязки, то есть панель свойств дизайнера WPF и добавленные визуальные студийные дополнения, такие как Resharper, которые могут помочь, но в конечном итоге они не выполняют такую ​​отличную работу ничем, кроме простых привязок, поэтому что вы остаетесь с самим собой и своим пониманием того, что происходит.

+0

См. Мое редактирование выше. Похоже, что эта методика правильная, но поскольку столбцы не являются FrameworkElements, это все равно не удается. – Matt

+0

Это не работает, как указано OP. Так почему же это ответ? – user99999991

+0

x: ссылка, кажется, единственный способ сделать это. http://stackoverflow.com/questions/22073740/binding-visibility-for-datagridcolumn-in-wpf – user99999991

1

я нашел несколько подходов к связыванию вне визуального дерева из этой статьи: Artificial Inheritance Contexts in WPF

Я пока я использую четвертый вариант (относящийся к тому, что он говорит). Это довольно хаки, но просто. Это имеет недостаток, что дизайнеру WPF это не нравится и помещает ошибки в ваш журнал ошибок во время разработки. Чтобы добраться до окружающего объекта DataContext, вы можете привязать к чему-то еще в текущем файле XAML, который находится в визуальном дереве, с использованием расширения разметки x:Reference (см. msdn). Это похоже на привязку к ElementName, за исключением того, что он не зависит от наличия InheritanceContext, который обычно не находится за пределами визуального дерева. Я просто использую манекен FrameWorkElement, если в ссылке UserControl ничего не найдено.

Я пытался просто ссылаться на содержащий UserControl (или Window или Page, и т.д.), но это приводит к круговому эталонным исключения, так что я живу с фиктивным элементом, пока кто-то не показывает мне лучший путь.

<FrameworkElement Name="dummyElement" /> 
<DataGrid> 
    <DataGrid.Columns> 
     <DataGridTextColumn 
      Visibility="{Binding Source={x:Reference dummyElement}, 
           Path=DataContext.Foo}" 
     /> 
Смежные вопросы