2009-08-29 11 views
0

architecture simplifiée de mon application Silverlight:UserControl Visibilité de liaison par ViewModel

  • MainPage; DataContext ensemble à MainViewModel
  • MainPage comporte deux éléments: UserControl et Rectangle
  • dans MainViewModel, j'ai deux propriétés, UserControlVisible et RectVisible, les deux de type visibilité, binded aux propriétés de visibilité de ces deux éléments dans MainPage.xaml
  • MainViewModel a mis en œuvre INotifyPropertyChanged

Le problème est, quand je mets la propriété RectVisible dans MainViewModel à Visibility.Collapsed, Rectangle cache, ce qui est bien, mais quand je mets Visibility.Collapsed à UserControl (propriété UserControlVisible), il ne se cache jamais!
Je ne peux pas cacher ce contrôle utilisateur, et je dois le faire à travers ma classe ViewModel. Pourquoi cela fonctionne avec l'élément Rectangle, mais pas avec UserControl? Lorsque je définis manuellement Visibilité à Réduire dans XAML, il est masqué, mais je dois le faire à travers le code et l'objet ViewModel.

(modifier) ​​de sollution temporaire:

Je me suis abonné manuellement à l'événement PropertyChanged dans codebehind

void MainPage_Loaded(object sender, RoutedEventArgs e) 
{ 
    viewmodel=new MainViewModel(); 
    this.DataContext = viewmodel; 
    // fix for binding bug: 
    viewmodel.PropertyChanged += viewmodel_PropertyChanged; 
} 

void viewmodel_PropertyChanged(object sender, PropertyChangedEventArgs e) 
{ 
    if (e.PropertyName == "LoginVisible") 
     loginWindowControl.Visibility = viewmodel.LoginVisible; 
} 

Répondre

0

Vous avez probablement besoin de trouver un moyen de lier la propriété de visibilité à la racine de votre contrôle utilisateur visuels (la grille/panneau).

+0

essayé, mais toujours la liaison ne fonctionne pas, il se cache uniquement lorsque je définis la propriété par codebehind –

+0

soin de partager comment vous configurez la liaison (un sous-ensemble de votre XAML)? –

1

J'ai eu le même problème, et je l'ai corrigé et je ne sais pas si ma solution fonctionnera pour vous. Le datacontext de mon "MainPage" était différent du datacontext de mon UserControl. Je mettais le datacontext pour mon usercontrol manuellement via XAML Je vais donner un exemple:

<local:myusercontrol DataContext="myusercontroldatacontext" Visibiltiy="{Binding Path=VisibleProperty}"/> 

le VisibleProperty est ce cas devrait appartenir à la myusercontroldatacontext, et non le DataContext où le XAML parent est défini

+0

exemple serait grand –

+0

désolé je ne savais pas que le xml ne se présentera pas sans ajouter le code brakets. J'ai encore ajouté l'exemple. –

Questions connexes