2009-07-17 15 views
2

Je travaille actuellement sur une application SilverLight 3. J'utilise MVVM Pattern et Prism. J'ai tout fonctionne sauf l'article suivant. Sur l'une de mes vues, je dois utiliser un OpenFileDialog. J'ai essayé de le faire dans le ViewModel seulement pour découvrir que le modèle de sécurité de SilverLight l'interdit parce qu'il est seulement autorisé à être initié par l'utilisateur. J'ai depuis déplacé le code OpenFileDialog vers le code-behind de la vue. Voici mon problème cependant. Bien que je sois lié à la source définie sur TwoWay, il ne frappe pas le setter de la propriété dans mon ViewModel.Silverlight MVVM Prism et OpenFileDialog

Exemple de contrôle d'image avec une liaison:

<Image x:Name="imgCard" Height="283" Width="463" Canvas.Left="8" Canvas.Top="8" OpacityMask="White" Source="{Binding Path=CardImage, Mode=TwoWay}"/> 

Bouton Utilisé par l'utilisateur:

<Button x:Name="btnUpload" Height="20" Width="122" Canvas.Left="8" Canvas.Top="319" Content="Upload Image" Click="btnUpload_Click" /> 

Cliquez sur l'événement:

private void btnUpload_Click(object sender, RoutedEventArgs e) 
     { 
      OpenFileDialog ofd = new OpenFileDialog(); 
      ofd.Filter = "PNG Files(*.png)|*.png"; 

      ofd.ShowDialog(); 
      using (Stream stream = ofd.File.OpenRead()) 
      { 
       BitmapImage image = new BitmapImage(); 
       image.SetSource(stream); 
       imgCard.Source = image; 
      } 
     } 

Mon ViewModel met en œuvre le INotifyPropertyChanged et les éléments suivants sont propriété.

BitmapSource CardImage 
      { 
       get 
       { 
        return _imageSource; 
       } 
       set 
       { 
        _imageSource = value; 
        NotifyPropertyChanged("CardImage"); 
       } 
      } 

Si je mets un point d'arrêt sur le Setter. Ça ne le frappe jamais.

+0

Quel est le DataContext de votre fichier XAML? –

+0

Le DataContext est le ViewModel lui-même. Il est injecté par Unité. – cjibo

Répondre

0

Ok c'est un hack mais ça marche. Parce que je dois déclencher l'OpenFileDialog à partir de l'interface utilisateur, je peux au lieu de mettre à jour le contrôle directement l'attache arrière à DataContext pour mettre à jour la propriété. Cela fonctionne et rend toujours l'interface utilisateur comme je l'espère.

NOTE: HACK Jusqu'à ce que je trouve un meilleur moyen.

private void btnUpload_Click(object sender, RoutedEventArgs e) 
     { 
      OpenFileDialog ofd = new OpenFileDialog(); 
      ofd.Filter = "PNG Files(*.png)|*.png"; 

      ofd.ShowDialog(); 
      using (Stream stream = ofd.File.OpenRead()) 
      { 
       BitmapImage image = new BitmapImage(); 
       image.SetSource(stream); 
       BitmapSource b = image; 

       //HACK: This works but now I'm tethered a bit. This updates the context property CardImage. 
       ((DesignerViewModel) this.DataContext).CardImage = b; 
       //imgCard.Source = b; 
      } 
     } 
+0

Appelez-moi fou, mais je ne vois pas cela comme un hack. On s'attend à ce que OpenFileDialog ne soit pas utilisé dans votre ViewModel, et vous n'êtes pas vraiment "attaché" à votre ViewModel plus que d'avoir un TextBlock lié à une propriété dans votre ViewModel. Cela semble être la bonne chose à faire. – CSharper

1

Au moins dans Silverlight 2, je pense que la règle suivante peut expliquer pourquoi vous voyez ce comportement. "Si une propriété de dépendance est liée et que le code est défini explicitement sur la propriété, la liaison est supprimée." (source)

Peut-être que cela a changé pour Silverlight 3? Dans ce cas, je n'ai aucune suggestion.

Questions connexes