WPF UserControl в DataTemplate внутри ItemsControl - как привязать к родителю ItemsSource - PullRequest
8 голосов
/ 18 сентября 2009

Сюжетная линия говорит обо всем на самом деле! У меня есть пользовательский элемент управления, который может быть успешно связан, скажем, с объектом Fullname - то есть он работает нормально.

Теперь мне нужно показать их список, и, опять же, это работает нормально, когда элемент управления находится в DataTemplate в ItemsControl.Template.

Но у элемента управления есть свойство (InEditMode), которое является не свойством объекта Fullname, а объекта, у которого есть свойство FullnameList, к которому привязан ItemsControl, через ItemsSource. Это свойство InEditMode прекрасно работает, когда элемент управления отсутствует в списке и привязан к свойствам родительского брата с именами, скажем, ParentInEditMode и ParentFullname.

Вопрос в том, какой стиль выражения привязки требуется, чтобы «получить» свойство режима редактирования родительского объекта, когда элементом управления является ItemsControl?

Или я должен изменить дизайн объекта Fullname, чтобы он содержал свойство EditMode?

Большое спасибо заранее!

Обновление:

Элемент (то есть тот, который находится в коллекции, связанной с ItemsControl) НЕ имеет такого свойства. Код очень прост:

<ItemsControl ItemsSource="{Binding Path=FullnameList}"> 
...then...
<ItemsControl.ItemTemplate>
  <DataTemplate>
    <jasControls:NameView
      NameValue="{Binding Path=.}" 
      InEditMode= ??????? />

Общий родительский объект (модель представления для окна) имеет свойства:

  • FullnameList
  • ParentInEditMode
  • Полное имя (один элемент для тестирования NameView, который отлично работает с этим xaml вне любого элемента управления списком, используя:

    <jasControls:NameView NameValue="{Binding Path=Fullname}" InEditMode="{Binding Path=ParentInEditMode}"/>
    

Я хотел бы применить режим редактирования ко всей коллекции - сделать этот флаг частью Полного имени не кажется правильным!?

Ответы [ 2 ]

15 голосов
/ 18 сентября 2009

Я нашел ответ на свой вопрос, который, я надеюсь, поможет другим. Рабочий синтаксис у меня таков:

<StackPanel>
    <ItemsControl ItemsSource="{Binding Path=FullnameList}">
    ...then...
    <ItemsControl.ItemTemplate>
      <DataTemplate>
        <jasControls:NameView
          NameValue="{Binding Path=.}" 
          InEditMode= "{Binding DataContext.ParentInEditMode,RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type StackPanel}}}" />

Это правильно выбирает свойство, являющееся родным элементом FullnameList, и передает его элементу шаблона данных. Это скорее удача, чем суждение, но я надеюсь, что это верный способ сделать это!

0 голосов
/ 18 сентября 2009

Для каждого Item в ItemsSource ItemsControl создает указанный DataTemplate и своему DataContext назначает соответствующий Item. Теперь каждый DataTemplate может связываться со своим элементом в контексте данных.

Итак, я полагаю, у вашего элемента есть свойство "ParentInEditMode"; не должно быть проблем с привязкой к этому свойству.

Если это не сработает, пожалуйста, обновите ваш вопрос кодом.

...