WPF: проблема с табличкой данных ItemsControl в качестве пользовательского элемента управления - PullRequest
3 голосов
/ 11 сентября 2009

Это прекрасно работает:

 <ItemsControl ItemsSource="{Binding Persons}">
   <ItemsControl.ItemsPanel>
     <ItemsPanelTemplate>
       <StackPanel Orientation="Vertical" />
     </ItemsPanelTemplate>
   </ItemsControl.ItemsPanel>
   <ItemsControl.ItemTemplate>
     <DataTemplate>
       <StackPanel Orientation="Horizontal">
         <TextBlock Text="{Binding Path=FirstName}"/>
         <TextBlock Text="{Binding Path=LastName}"/>
       </StackPanel>
     </DataTemplate>
   </ItemsControl.ItemTemplate>
 </ItemsControl>

Но я хочу использовать пользовательский элемент управления вместо панели стека с двумя текстовыми блоками, используя что-то вроде:

  <DataTemplate>
    <jasControls:NameView/>
  </DataTemplate>

Но при этом и миллионе других синтаксисов NameView ничего не показывает, но он отлично работает в отдельном тесте, вне ItemsControl, с явно установленным свойством (зависимость) - например,

  <jasControls:NameView FName="{Binding Path=Person.FirstName}"  />

Я вряд ли смогу найти какие-либо примеры этого где-либо, и мне нужно знать, как указать свойства пользовательского элемента управления - или как пользовательский элемент управления может "получать" отдельный тип элемента (Персона)? Какой синтаксис использовать? Нужно ли указывать тип данных? Является ли ItemsControl причиной проблемы или какой-либо аналогичный элемент управления, например, ListBox? Могу ли я сделать так, чтобы пользовательский элемент управления получил весь объект Person? Какие свойства зависимостей мне нужны в пользовательском элементе управления? Одним словом, как получить данные в пользовательский элемент управления ?! Реальные бизнес-типы будут немного сложнее, включая некоторую логику в пользовательском элементе управления, поэтому я хочу использовать пользовательский элемент управления.

ЛЮБАЯ инструкция по этому вопросу будет принята с благодарностью - TIA

1 Ответ

5 голосов
/ 11 сентября 2009

Если ваша коллекция Persons содержит много объектов Person, свойство DataContext вашего элемента управления NameView будет автоматически установлено равным объекту Person.

Вам не понадобятся никакие свойства зависимостей для достижения этого умения. Ваш пользовательский контроль NameView будет просто:

<UserControl ...>
   <StackPanel Orientation="Horizontal">
      <TextBlock Text="{Binding FirstName}"/>
      <TextBlock Text="{Binding LastName}"/>
   </StackPanel>
</UserControl>

У вас не должно быть кода для отображения этой информации.

Оттуда вы сможете получить доступ к объекту Person из свойства DataContext:

Person person = this.DataContext as Person;
...