Как да промените DataContext на бутон към родителския DataContext?

Имам 2 класа в WPF:

  • Среща
  • хора

В срещата имам 2 ObservableCollections; AttendingMeeting и NotAttendingMeeting, които съдържат People обекта

В xaml DataContext са зададени на Meeting и имам 2 DataGrid (AttendingMeeting и NotAttendingMeeting)

Трябва да добавя Button към всеки от DataGrid, за да добавя и премахвам от Meeting, но след това трябва да променя DataContext на Button от например: AttendingMeeting на Meeting, така че класът Meeting да може да се справи с добавянето и премахването на People от ObservableCollections.

Как мога да направя това в xaml (промяна на DataContext от AttendingMeeting елементи на родителите parent-> Meeting)?


person code-zoop    schedule 24.09.2009    source източник


Отговори (1)


Ако приемем, че се опитвате да се свържете с команда в класа Meeting от DataGrid:

Можете да използвате RelativeSource във вашето обвързване, за да стигнете до DataContext, което ви интересува. Вашето маркиране ще изглежда подобно на това:

<Grid DataContext="..."> <!-- Assuming a grid is you're layout root and that it's datacontext is the Meeting you spoke of -->
   ...
   <DataGrid ...>
      ...

      <Button Content="Click Me!"
              Command="{Binding Path="DataContext.RemovePersonCommand"
                                RelativeSource={RelativeSource FindAncestor,
                                                AncestorType={x:Type Grid}}}"
              CommandParameter="{Binding}"/> <!-- This would be binding to the current person -->
      ...
   </DataGrid>
   ...
</Grid>

Можете също така да използвате ElementName, за да се свържете с родител, който има DataContext, който ви интересува, ако имате работа с много влагане и RelativeSource би било твърде сложно.

person dustyburwell    schedule 24.09.2009
comment
Благодаря, че ме насочихте към решение. Това е моето работещо командно обвързване: Command={Binding ElementName=SelectedMeeting, Path=DataContext.AddPatientsToMeetingCommand} CommandParameter={Binding} - person code-zoop; 25.09.2009
comment
Лично аз бих предпочел да използвам ElementName, вместо да се катеря по дървото, търсейки предшественик. Това дава директна препратка към елемента, който искате да използвате, вместо да разчитате на структурата да не се променя по начин, който да повлияе на катеренето ви по дърво (добавяне на друга решетка в някакъв момент между тях). - person stiank81; 25.09.2009
comment
Радвам се, че помогнах. @bambuska, съгласен съм... катеренето по дърветата определено не е най-добрият подход, особено когато се търси нещо толкова обичайно като Grid. - person dustyburwell; 25.09.2009