2009-06-29 11 views
6

El siguiente código subyacente obras vinculante para el control de usuario SmartFormView:¿Cómo puedo vincular esta Vista a este modelo de vista?

Vista:

<UserControl x:Class="CodeGenerator.Views.PageItemManageSettingsView" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:v="clr-namespace:CodeGenerator.Views" 
    xmlns:vm="clr-namespace:CodeGenerator.ViewModels" 
    Background="#ddd"> 

    <Grid Margin="10"> 
     <ScrollViewer DockPanel.Dock="Top"> 
      <StackPanel Margin="10"> 
       <v:SmartFormView/> 
      </StackPanel> 
     </ScrollViewer> 
    </Grid> 

</UserControl> 

de código subyacente:

using System.Windows.Controls; 
using CodeGenerator.ViewModels; 

namespace CodeGenerator.Views 
{ 
    public partial class SmartFormView : UserControl 
    { 
     public SmartFormView() 
     { 
      InitializeComponent(); 
      DataContext = new SmartFormViewModel("testing"); 
     } 
    } 
} 

Sin embargo, quiero obligar a la SmartFormView a su SmartFormViewModel en ViewModel de la vista llamante, no codificado en el código detrás. Sin embargo, estos dos enfoques no se unen:

<UserControl.Resources> 
<DataTemplate DataType="{x:Type vm:SmartFormViewModel}"> 
    <v:SmartFormView/> 
</DataTemplate> 
</UserControl.Resources> 

... 

<Grid Margin="10"> 
<ScrollViewer DockPanel.Dock="Top"> 
    <StackPanel Margin="10"> 
     <TextBlock Text="{Binding Testing}"/> 
     <v:SmartFormView DataContext="{Binding SmartFormViewModel}"/> 
     <ContentControl Content="{Binding SmartFormViewModel}"/> 
    </StackPanel> 
</ScrollViewer> 
</Grid> 

En el modelo de vista que tengo "Prueba" y "SmartFormViewModel" define como propiedades ViewModel y llenar los dos (como se muestra a continuación), pero aunque la propiedad de Pruebas une fina, la la SmartFormView no se une a su SmartFormViewModel:

private SmartFormViewModel _smartFormViewModel=; 
public SmartFormViewModel SmartFormViewModel 
{ 
    get 
    { 
     return _smartFormViewModel; 
    } 
    set 
    { 
     _smartFormViewModel = value; 
     OnPropertyChanged("SmartFormViewModel"); 
    } 
} 

private string _testing; 
public string Testing 
{ 
    get 
    { 
     return _testing; 
    }  
    set 
    { 
     _testing = value; 
     OnPropertyChanged("Testing"); 
    } 
} 

public PageItemManageSettingsViewModel(MainViewModel mainViewModel, PageItem pageItem) 
    : base(mainViewModel, pageItem) 
{ 
    SmartFormViewModel SmartFormViewModel = new SmartFormViewModel("manageSettingsMain"); 
    Testing = "test ok"; 
} 

Cuál es la sintaxis para enlazar un control de usuario en XAML a un modelo de vista específico en el llamando al ViewModel de View?

Respuesta

6

Podría estar mal, pero creo que solo tiene un error en su código.

SmartFormViewModel SmartFormViewModel = new SmartFormViewModel("manageSettingsMain"); 

debe ser:

SmartFormViewModel = new SmartFormViewModel("manageSettingsMain"); 

es decir. Su SmartFormViewModelnunca se está configurando. Por lo tanto, el enlace que tiene en su vista principal no lo encuentra.

Además de esto, una mejor manera de hacer esto es simplemente para pegarse a su hijo VM en el árbol visual:

<ContentControl Content="{Binding SmartFormViewModel}"/> 

Y utilizar un DataTemplate hacer la resolución de la vista en lugar de "codificación dura "la vista hacia, um, la vista principal".

+0

sí, gracias por encontrar eso, agradable de ver, está bien, así que también probé la segunda vía y eso también funciona bien, y eso tiene más sentido para mí, por lo que parece que "define regiones vacías" que luego se rellenan con ViewModels dinámicamente, que automáticamente se unen a sus DataTemplates apropiadas durante la renderización, tienen sentido, son agradables, ¡gracias! –

Cuestiones relacionadas