2015-02-04 3 views
0

Мой сценарий ListView: В текущей странице я поставил DataContext, который состоит из двух свойств, первый (заголовок страницы) Question, второй (список элементов) Replies.Получить родительский DataContext внутри элемента

Я связывании Replies к ItemsSource свойству ListView:

<ListView x:Name="responseList" ItemsSource="{Binding replies}"> 
     <ListView.ItemTemplate> 
      <DataTemplate> 
       <local:CustomControl /> 
      </DataTemplate> 
     </ListView.ItemTemplate>  
    </ListView> 

До этого момента нет никаких проблем. Внутри этого Custom Control, Мне нужно также получить некоторые свойства элемента Question (который находится за пределами ListView), привязывая эти свойства к XAML CustomControl.

Я смотрел на это, но не повезло, так как FindAncestor не признается в WinRT: WPF Databinding: How do I access the "parent" data context?

Это другая ничего не возвращает, как DataContext: How to access Parent's DataContext in Window 8 store apps

<UserControl ....> 
    <Grid Background="#33FFFFFF"> 
     <Grid.Resources> 
       <local:converter1 x:Key="key" Question="{Binding Tag.Question, ElementName=responseList}"/> 
     </Grid.Resources> 
    </Grid> 
</UserControl> 
+0

ElementName Решение будет работать только тогда, когда вы находитесь в том же контексте именования в качестве имени элемента, который вы ссылаетесь, который работает отлично в DataTemplates. Вы пытаетесь это изнутри Usercontrol, который представляет собой другой контекст именования. Я не думаю, что в настоящее время существует решение, которое можно сделать только через Xaml и Binding. Вероятно, вам нужно добавить родительское свойство навигации в свои ответы. –

+0

Это именно то, что предложил Барт ван Ниероп в качестве ответа. :) –

ответ

0

Вы можете иметь ваш Replies есть (n непреложный) ссылка на вопрос, на который они отвечают. Или, возможно, лучше, если ваш DataContext является SomePageViewModel, его список replies не относится к вашей модели домена Reply, но вместо ReplyViewModel, который знает как ответ, так и соответствующие части вопроса.

Это на самом деле не отвечает на ваш вопрос, но это намного лучший дизайн, и он делает решить проблему.

Один из способов это может быть структурировано без изменения модели предметной области Reply выглядит следующим образом:

// Domain Model example 
class Question 
{ 
    public String Text { get; set; } 
    public String Author { get; set; 
    public IEnumerable<Reply> Replies { get; set; } 
} 

// Domain Model example 
class Reply 
{ 
    public String Author { get; set; } 
    public String Text { get; set; } 
} 

// DataContext example 
class WhatYouUseAsDataContext 
{ 
    public Question Question { get; set; } 

    // Your replies -- this is what your ListView binds to. 
    public IEnumerable<ReplyViewModel> Replies { get; set; } 

    public WhatYouUseAsDataContext() 
    { 
     Question = SomeWayToGetTheQuestion(); 
     Replies = Question.Replies.Select(reply => new ReplyViewModel() 
     { 
      Reply = reply, 
      QuestionAuthor = Question.Author 
     }); 
    } 
} 

// Newly introduced viewmodel class 
class ReplyViewModel 
{ 
    public Reply Reply { get; set; } 
    public String QuestionAuthor { get; set; } 
} 
+0

Это возможно только для модификации структуры объекта «Ответ»? Я не могу найти способ запутать функциональный ViewModel – fillobotto

+0

Я отредактировал в примере. –

+0

Я надеялся найти способ, который бы не дублировал свойства, но кажется невозможным. Альтернативой является использование глобальной переменной для текущего открытого вопроса ... – fillobotto

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