2017-09-14 2 views
0

Pourquoi la liaison de données peut-elle être visible dans le concepteur: Click to show image: Databinding seems OK Mais le runtime ne montre rien? Click to show image: No Data, no usercontrol?MVML DataBinding OK dans Designer, pas au moment de l'exécution

structure code hiérarchique:

ViewModelBase: baseclass héritant de INotofyPropertychanged

public class ViewModelBase : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 

    protected virtual bool SetProperty<T>(ref T storage, T value, [CallerMemberName] string propertyName = "") 
    { 
     if (EqualityComparer<T>.Default.Equals(storage, value)) 
      return false; 
     storage = value; 
     this.OnPropertyChanged(propertyName); 
     return true; 
    } 
} 

SiteViewModel: Modèle classe avec Id/Nom/Description Propriétés

public class SiteViewModel : ViewModelBase 
{ 
    private int _SiteID; 
    private string _Name; 
    private string _Description; 

    public int SiteID 
    { 
     get { return _SiteID; } 
     set { SetProperty(ref _SiteID, value); } 
    } 

    public string Name 
    { 
     get { return _Name; } 
     set { SetProperty(ref _Name, value); } 
    } 

    public string Description 
    { 
     get { return _Description; } 
     set { SetProperty(ref _Description, value); } 
    } 
} 

SitesViewModel: ObservableCollection de SiteViewModel

public class SitesViewModel : ViewModelBase 
{ 
    private ObservableCollection<SiteViewModel> _AllSites; 

    public ObservableCollection<SiteViewModel> AllSites { 
     get { return _AllSites; } 
     set { SetProperty<ObservableCollection<SiteViewModel>>(ref _AllSites, value); } 
    } 

    public SitesViewModel() 
    { 
     AllSites = new ObservableCollection<SiteViewModel>(); 
     for (int count = 1; count <= 3; count++) 
     { 
      AllSites.Add(new SiteViewModel { SiteID = count, Name = "Test" + count.ToString(), Description = "Site:" + count.ToString() }); 
     } 
    } 
} 

SiteManagerControl: UserControl avec un _AllSites de propriété SitesViewModel

public partial class SiteManagerControl : UserControl 
{ 
    private SitesViewModel _AllSites; 
    public SitesViewModel AllSites 
    { 
     get { return _AllSites; } //<-- Breakpoint not hit! 
     set { 
      if (_AllSites != value) 
      { _AllSites = value; 
       OnPropertyChanged("AllSites"); 
      }} 
    } 

    public SiteManagerControl(){ 
     _AllSites = new SitesViewModel();} 

(XAML peut être vu dans la première image liée ci-dessus, notez le point d'arrêt ne ligne frappé au-dessus). Le contrôle utilisateur est hébergé dans un Tabcontrol faisant partie d'un ObservableCollection. Je ne pense pas que ce soit un problème dans la liaison de données. Va poster le code pour les onglets si nécessaire.

Il n'y a pas d'erreur dans la fenêtre Sortie de débogage pour indiquer pourquoi la liaison de données échoue.

+0

Postez le XAML de votre TabControl. Quel est son DataContext? – mm8

+0

UserControls doit être conçu pour vos modèles ou vos modèles de vue. Vous ne devez pas concevoir un modèle de vue pour votre UserControl. Est-ce qu'un TextBox a un TextBoxViewModel? Non, et il y a une très bonne raison pour ça. Pour plus de détails [lire cette réponse.] (Https://stackoverflow.com/a/44729258/1228) En outre, vous pouvez toujours utiliser des outils comme Snoop pour examiner vos liaisons lors de l'exécution. Il vous aurait montré que le modèle de vue parent a été hérité par votre contrôle utilisateur, qui a remplacé le site SitesViewModel. – Will

Répondre

0

Votre listview DataContext La liaison de données est avec l'objet de la classe (SitesViewModel) Cette classe a la propriété nommée (AllSites) qui possède également une propriété de collection oveservable (AllSites).

donc je pense que vous devez fixer le ItemSource obligatoire dans la vue de la liste comme ceci:

ItemsSource="{Binding AllSites.AllSites}" 
+0

Hélas pas de joie, cela brise juste la reliure dans le concepteur. Toujours pas de liaison dans l'exécution. Je peux voir que {Binding AllSites.AllSites} a seulement une propriété (.Count). –