2013-03-05 2 views
0

У меня есть композитный вид, что состоит элементом управления родительского пользователя (Counterparties_MainWindow) с к Embeded пользовательских элементов управления (Counterparties_UserInputs и Counterparties_SystemDetails):Привязка к CollectionViewSource родительского контроля

<UserControl x:Class="Counterparties_MainWindow"> 
<av:UserControl.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="Counterparties_Dictionary.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 
     <CollectionViewSource x:Key="counterpartiesDataView" Source="{Binding Path=CounterpartiesData}" /> 
    </ResourceDictionary> 
</av:UserControl.Resources> 

<DockPanel> 
    <DockPanel> 
     <GUI:Counterparties_UserInputs x:Name="UserInputs"/> 
     <GUI:Counterparties_SystemDetails x:Name="SystDetails"/> 
    </DockPanel> 
</DockPanel> 

В «Counterparties_SystemDetails» содержит сетку, которая отображает некоторые уже определенные поля из CounterpartiesData (список объектов). «Counterparties_UserInputs» отображает список еще не определенных полей из данных CounterpartiesData, которые должны быть определены пользователем.

Я использовал, чтобы иметь CollectionViewSource в Counterparties_SystemDetails управления пользователя XAML и привязки непосредственно сетки к ней, она работает (то есть отображение мне детали CounterpartiesData):

<DataGrid Name="CounterpartiesGrid" ItemsSource="{Binding Source={StaticResource counterpartiesDataView}}" 
SelectedItem="{Binding Path=SelectedCounterparty, Mode=OneWayToSource}" Style="{StaticResource DataGridStyle}"> 

Однако теперь, когда я ve переместил CollectionViewSource в родительское окно, чтобы совместно использовать один и тот же объект CounterpartiesData в обоих субконтроллерах, я не могу найти способ привязать его к моей сетке. Не могли бы вы получить несколько советов о том, как это сделать?

Последнее, но не менее важное: я хотел бы отобразить текущее выбранное имя встречного вызова в поле текстового поля пользовательского элемента управления Counterparties_UserInputs. Знаете ли вы, как я могу легко получить к нему доступ?

Спасибо!

ответ

0

Вы должны быть в состоянии просто передать counterpartiesDataView как DataContext вашему UserControl

<DockPanel> 
    <DockPanel> 
     <GUI:Counterparties_UserInputs x:Name="UserInputs" DataContext="{Binding Source={StaticResource counterpartiesDataView}}" /> 

И установить ItemSource вашего UserControl

<DataGrid Name="CounterpartiesGrid" ItemsSource="{Binding}" /> 

Однако IDF вас UserControl уже использует его DataContext для что-то еще вы можете использовать FindAncestor, чтобы найти Родитель и привязать его к одному из его свойств.

<DataGrid Name="CounterpartiesGrid" ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type UserControl}},Path=CounterpartiesData}"> 
+0

Спасибо, это работает отлично! Однако я забыл спросить то, что я добавил в конце вопроса. Мне также нужно будет отобразить текущее выбранное имя контрагента в сетке в текстовое поле, которое находится в Counterparties_UserInputs на этот раз. Я пытался связать его, но не нашел правильного синтаксиса: '' – goul

+0

вы должны уметь связывать DataGrid, что-то например «Text =» {Binding ElementName = dataGridName, Path = SelectedItem.cptyName} "' –

+0

Извините, не удалось правильно объяснить. Datagrid находится в «Counterparties_SystemDetails», текстовом поле в «Counterparties_UserInputs», оба указывающие на тот же самый «DataContext», поэтому не уверены, как получить доступ к datagrid из другого элемента 'UserControl'. Вот мой журнал ошибок, надеюсь, что это поможет: 'BindingExpression не может получить значение из-за недостающей информации. BindingExpression: Path = SelectedCounterparty; DataItem = 'ListCollectionView'; целевой элемент - «DataGrid» (Name = 'CounterpartiesGrid'); target свойство «SelectedItem» (тип «Object») ' – goul

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