2010-05-17 7 views
0

J'ai une fenêtre nommée ParameterEditorView avec ParameterEditorViewModel comme DataContext. Dans le ParameterEditorViewModel j'ai une liste de ParameterViewModel. Dans le ParameterEditorView j'ai un ItemsControl dont ItemsSource est lié à la liste de ParameterViewModel dans le ParameterEditorViewModel. J'ai besoin du ParameterViewModel pour avoir une référence à ParameterView (plus sur cela plus tard). Dans la section Resources du ParameterEditorView ajouter la DataTemplate:Passer la vue à viewmodel avec datatemplate

<DataTemplate DataType="{x:Type my:ParameterViewModel}" > 
    <my:ParameterView HorizontalAlignment="Left"/> 
</DataTemplate> 

Alors, comment puis-je passer une référence du ParameterView qui est créé pour montrer le ParameterViewModel à elle?

La raison pour laquelle j'ai besoin du ParameterView dans le ParameterViewModel est la suivante: J'ai un TextBox dont Text propriété est binded à la propriété PropertyModelView.Name. Mais je veux afficher une chaîne par défaut lorsque le Name est vide ou nul. J'ai essayé de définir la valeur de propriété à la chaîne par défaut que je veux quand cela se produit mais le TextBox.Text n'est pas défini dans ce scénario. Je fais quelque chose comme ceci:

private string _name; 
public string Name 
{ 
    get { return _name; } 
    set 
    { 
     if (value == null || value.Length == 0) 
      Name = _defaultName; 
     else 
      _name = value; 
    } 
} 

J'ai aussi essayé de définir précisément le mode de liaison TextBox.Text à TwoWay sans succès. Je pense que c'est un mécanisme de défense pour empêcher une boucle infinie de se produire mais je ne sais pas avec certitude. Toute aide sur ce front serait également très appréciée.

Merci, José Tavares

Répondre

1

{Binding } has a FallbackValue, btw.

Votre question, il me confond. Je suppose que votre PVM a une collection de PV en tant que propriété publique, qui est liée à l'interface utilisateur. De plus, je pense que vous mélangez des termes. Son Model-View-ViewModel où le ViewModel est le DataContext de la View, et le Model est exposé par ViewModel via une propriété publique. On dirait que si vous liez la fenêtre à une collection de ViewModels, ils sont en fait des modèles. Cela peut sembler pédant, mais obtenir vos termes corrects vous aidera à faire des recherches et à poser des questions.

Une autre solution serait d'ajouter un convertisseur à votre liaison en combinaison avec FallbackValue (j'ai dû le faire, IIRC). Ce convertisseur serait un IValueConverter qui renvoie "DependencyProperty.UnsetValue" si la chaîne est nulle ou vide. Je pense que cela fonctionne parfois parce que le TextBox définira la propriété liée à la chaîne vide plutôt que null si le TB est vide. Voici un petit échantillon pour aiguiser votre sifflet (pas garanti, vous devez déboguer ce et apportez des modifications):

public class ThisMightWorkConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, 
     object parameter, System.Globalization.CultureInfo culture) 
    { 
     var temp = value as string; 
     if(string.IsNullOrWhiteSpace(temp)) 
      return System.Windows.DependencyProperty.UnsetValue; 
     return temp; 
    } 

    public object ConvertBack(object value, Type targetType, 
     object parameter, System.Globalization.CultureInfo culture) 
    { 
     return value; // you might need to change this 
    } 
} 
+0

Eh bien, je ne me suis pas peut exprimer clairement. J'ai une fenêtre nommée ParameterEditorView et un ParameterEditorViewModel. Dans le ParameterEditorView j'ai une liste de ParameterViewModel. Dans le ParameterEditorView j'ai un 'ItemsControl' dont' ItemsSource' est lié à la liste de ParameterViewModel dans le ParameterEditorViewModel. Je définis également le 'DataTemplate' montré ci-dessus dans le ParameterEditorView. La liaison fonctionne correctement, mais je veux savoir si je peux passer la référence de ParameterView, qui est automatiquement créée pour afficher un ParameterViewModel, à ParameterViewModel. – jpsstavares

+0

@jps en supposant que ParameterView est un UserControl. Si vous essayez de transmettre un morceau d'interface utilisateur à ViewModel ou à un modèle, vous faites quelque chose de mal.Je pense que ce serait à votre avantage d'exposer votre problème et de demander des solutions plutôt que d'aller dans la même direction que vous. FallbackValue est une option. J'ai édité pour ajouter une deuxième option. – Will

+0

Je suppose que cette deuxième option est une bonne option pour surmonter le problème. Merci pour l'aide. – jpsstavares