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

Это отлично работает:

 <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


person Community    schedule 11.09.2009    source источник


Ответы (1)


Предполагая, что ваша коллекция 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;
person Anderson Imes    schedule 11.09.2009
comment
Замечательно (для меня!), Что это работает! Я использовал «миниатюрную модель представления» и свойства зависимостей в UC. Я до сих пор не знаю, почему не работает DP типа Person ...? В любом случае реальный контекст более сложен, и одно свойство, которое мне нужно «передать», - это имя типа элемента управления, с помощью которого я буду отображать соответствующий элемент управления для редактирования. Я могу видеть текст данных, как вы сказали, но теперь нужно разобраться, когда я могу динамически добавлять элемент управления в пользовательский элемент управления. Остается еще один вопрос - когда нужны свойства зависимостей в этой ситуации? Большое спасибо за вашу помощь! - person ; 11.09.2009
comment
Вы можете создать свойство зависимости типа Person в вашем пользовательском элементе управления и установить для него значение {Binding}. Если вы действительно хотите разделить FName и LName, вы можете установить для них FName = {Binding FirstName}, но вы, вероятно, не сильно выиграете. - person Anderson Imes; 11.09.2009