2015-07-14 2 views
0

Я нахожу необходимость связываться с DataContext в виде Page, который устанавливается следующим образом:Привязать к Пейджу DataContext

<d:Page.DataContext> 
    <designTime:PayeesPageDesignViewModel /> 
</d:Page.DataContext> 

Во время разработки. Тем не менее, мне нужно привязать к нему из дочернего элемента управления, который имеет другой контекст данных:

<GridView x:Name="PayeesGridView" 
      Margin="0,30,0,0" 
      IsItemClickEnabled="True" 
      ItemsSource="{Binding Payees}" 
      SelectionChanged="PayeesGridView_OnSelectionChanged"> 

Поскольку ItemsSource устанавливается для GridView, то DataContext моего GridViewItems устанавливается в отдельных Payee объектов в Payees коллекция. У моего ViewModel есть свойство, которое мне нужно ссылаться от View в конвертере, чтобы определить видимость элемента.

Я могу установить видимость, основанный на свойстве Payee объекта, как это:

<Border Width="250" 
     Height="250" 
     Background="Gray" 
     Opacity="0.85" 
     Visibility="{Binding Path=IsOpen, 
        Converter={StaticResource AccountStatusToVisibilityConverter}}"> 

Но что мне действительно нужно, чтобы связать То- Settings.ShowInactive свойство объекта Page «s DataContext. Есть ли способ захватить этот контекст из дочернего элемента управления? Я использую WinRT, поэтому у меня нет преимущества источника привязки FindAncestor.

EDIT

Как было предложено в комментариях, я пытался изменить связывание выглядеть следующим образом:

Visibility="{Binding Path=DataContext.Settings.ShowInactivePayees, ElementName=PageName, 
      Converter={StaticResource AccountStatusToVisibilityConverter}}"> 

Но когда я поставил точку останова в AccountStatusToVisibilityConverter, конвертер никогда не достигается ,

+0

Дайте страницу 'x: Name' и используйте привязку' ElementName'? – Clemens

+0

А, спасибо. Я знал, что есть способ сделать это, но я не мог понять это. Это то, что я получаю для программирования в середине ночи :) Я пытаюсь связать «ElementName =» PageName.DataContext »и« Path = »Settings.ShowInactivePayees« ', но переданное значение« null », хотя' DesignTimeViewModel' жестко запрограммирован как «false», и я пытаюсь во время выполнения с 'ShowInactivePayees' установить' true' или 'false'. –

+0

'PageName.DataContext' не является именем элемента. Ваша привязка обязательно должна выглядеть так: {{Binding Path = DataContext.Settings.ShowInactive, ElementName = PageName} '. – Clemens

ответ

1

Как вы назначаете ItemTemplate в GridView? Что делать, если вместо изменения содержимого шаблона вы изменили весь шаблон? Подобно этому pseudo xaml ...

<Page.Resources> 
    <DataTemplate x:Key="ActiveTemplate"></DataTemplate> 
    <DataTemplate x:Key="InactiveTemplate"></DataTemplate> 
    <local:IsActiveToItemTemplateConverter x:Key="IsActiveToTemplate" 
     ActiveTemplate="{StaticResource ActiveTemplate}" 
     InactiveTemplate="{StaticResource InactiveTemplate}" 
     /> 
</Page.Resources> 

<GridView 
    ItemsSoucre="{Binding Payees}" 
    ItemTemplate="{Binding Settings.ShowInactive, Converter={StaticResource IsActiveToTemplate}}" 
    IsItemClickEnabled="{Binding Settings.ShowInactive, Converter={StaticResource BooleanNot}}" 
    /> 
+0

Мне нравится эта идея. Я попробую что-то подобное сегодня вечером, когда вернусь домой с работы. Спасибо за предложение. Я не понимал, что у меня могут быть отдельные шаблоны. –

+0

Есть ли способ установить «DataContext» отдельных шаблонов?Все правильно связывается, но ReSharper не любит все неразрешенные свойства. Он считает, что 'DataContext' является контекстом страницы, а не' ItemsSource' 'GridView'. –

+0

Элементы, которые создаются в списке, будут иметь DataContext своего конкретного элемента списка ... так что «Получатель». Код приложения не может изменить, какой объект будет назначен в качестве DataContext, потому что все это происходит в частном коде GridView. Я думаю, что ваши предметы не должны разговаривать с DataContext страницы. Это похоже на проблему технического обслуживания, ожидающую вас. Однако, если вам нужно, вы всегда можете заставить каждый объект Payee иметь свойство, которое указывает на ViewModel страницы и устанавливать это свойство при создании объектов Payee. Тогда у вас будет легкий доступ к нему внутри элемента. – DrewCan

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