2009-06-29 7 views
6

qui suit la liaison code-behind travaille pour le contrôle de l'utilisateur SmartFormView:Comment puis-je lier cette vue à ce ViewModel?

Vue:

<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> 

code-behind:

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

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

Cependant, je veux lier le SmartFormView à son SmartFormViewModel dans le ViewModel de la vue d'appel, non codé en dur dans le code-behind. Pourtant, ces deux approches ne se lient pas:

<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> 

Dans le ViewModel je « Test » et « SmartFormViewModel » défini comme propriétés ViewModel et les remplir à la fois (comme indiqué ci-dessous), mais bien que la propriété test se lie bien, plus le SmartFormView ne se lie pas à son 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"; 
} 

Quelle est la syntaxe pour lier un UserControl en XAML à un ViewModel spécifique dans le appel ViewModel de View?

Répondre

6

Peut-être tort, mais je pense que vous avez juste un bug dans votre code.

SmartFormViewModel SmartFormViewModel = new SmartFormViewModel("manageSettingsMain"); 

devrait être:

SmartFormViewModel = new SmartFormViewModel("manageSettingsMain"); 

ie. Votre SmartFormViewModeln'est jamais défini. Par conséquent, la liaison que vous avez dans votre vue parent ne le trouve pas.

Suite à cela, une meilleure façon de le faire est juste pour tenir votre enfant VM dans l'arbre visuel:

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

Et utiliser un DataTemplate pour faire la résolution de la vue plutôt que « coder en dur "La vue dans la, euh, vue des parents.

+0

oui c'était ça, merci d'avoir trouvé cela agréable à voir, ok donc j'ai aussi essayé votre deuxième chemin et ça marche bien, aussi, et cela me semble plus logique, donc vous semblez "définir des régions vides" sont ensuite remplis dynamiquement par ViewModels qui se lient automatiquement à leurs DataTemplates appropriés lors du rendu, a du sens, sympa, merci! –

Questions connexes