2014-02-19 4 views
1

Target: Windows Store Framework: MvvmCrossПривязка ContentPresenter к вложенным ViewModel не работает, как ожидалось

У меня есть MyViewModel, содержащий OtherViewModel как свойство.

public class OtherViewModel : MvxViewModel 
{ 
    public string Name { get; set; } 
} 

public class MyViewModel : MvxViewModel 
{ 
    public string Id { get; set; } 
    private OtherViewModel _theOther; 

    public OtherViewModel TheOther 
    { 
     get { return _theOther; } 
     set 
     { 
      _theOther = value; 
      RaisePropertyChanged(() => TheOther); 
     } 
    }   
} 

Когда я использую следующий вид (XAML, упрощенный)), содержание в ContentPresenter всегда будет нулевым (с использованием WinRTXamlToolkit.Debugging.DC.ShowVisualTree() для исследования)

<views:MvxStorePage> 
    <Grid> 
     <TextBlock Text="{Binding TheOther.Name}"/> 
     <ContentPresenter Content="{Binding TheOther}" ContentTemplate="{...}"/> 
    </Grid> 
</views:MvxStorePage> 

Однако, когда я определяю представление следующим образом (привязывая Content к TextBlock DataContext), он работает.

<views:MvxStorePage> 
    <Grid> 
     <TextBlock Name="tb" DataContext="{Binding TheOther}" Text="{Binding Name}"/> 
     <ContentPresenter Content="{Binding DataContext, ElementName=tb}" ContentTemplate="{...}"/> 
     </Grid> 
    </views:MvxStorePage> 

Любая идея, почему?

+0

Попробуйте использовать 'ContentControl' вместо того,' ContentPresenter'. –

ответ

3

ContentPresenter обычно используется в ControlTemplate.

Вместо этого используйте ContentControl.

+0

Получил это от использования ContentControl вместо ContentPresenter, хотя я считаю это нелогичным. В WPF для этого я бы использовал ContentPresenter, а не ContentControl. Также почему DataBinding на ContentPresenter не работает, когда привязан «напрямую», но работает с использованием «промежуточного» (TextBlock) –

0

Обычно вы используете ContentPresenter в контрольной таблице ContentControl, чтобы указать, где должен быть добавлен контент. Каждый тип ContentControl имеет ContentPresenter по умолчанию: ControlTemplate.

Смотрите эту link для получения дополнительной информации

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