2009-07-17 20 views
2

私は現在SilverLight 3アプリケーションを開発中です。 MVVM PatternとPrismを使用しています。私は以下の項目を除いてすべてが働いています。私の意見の1つでは、OpenFileDialogを使用する必要があります。私はViewModelでこれをやろうとしましたが、SilverLightのセキュリティモデルは、ユーザーが開始することだけが許可されているため、SilverLightのセキュリティモデルを禁止しています。私はその後、OpenFileDialogコードをビューのコードビハインドに移動しました。私の問題はここにあります。私はTwoWayに設定されたソースにバインドしていますが、ViewModelのプロパティのセッターに当たっていません。バインディングとImageコントロールのSilverlight MVVM PrismとOpenFileDialog

例:ユーザが使用

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

ボタン:

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

Clickイベント:

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

私のViewModelはINotifyPropertyChangedのを実装していると、次のいプロパティ。

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

私はセッターにブレークポイントを設定します。それは決してそれを打つことはありません。

+0

XAMLファイルのDataContextとは何ですか? –

+0

DataContextはViewModel自体です。 Unityによって注入されます。 – cjibo

答えて

0

これはハックですが動作します。 UIからOpenFileDialogを起動する必要があるため、コントロールを直接逆テザーをDataContextに更新してプロパティを更新することはできません。これは動作し、私は期待どおりのUIをレンダリングします。

注:私はより良い方法を見つけるまで。

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

私を狂気と呼びますが、私はこれをハックとして見ません。 OpenFileDialogはあなたのViewModelで使用されず、ViewModelのプロパティにTextBlockがバインドされているよりも、実際にViewModelに「テザリング」しているわけではありません。それは適切なことのように聞こえる。 – CSharper

1

少なくともSilverlight 2では、この動作をなぜ見ているのかを次のルールで説明します。 "依存関係プロパティがバインドされ、コードでプロパティが明示的に値に設定されている場合、バインディングは削除されます。" (source

これはSilverlight 3用に変更されている可能性がありますか?その場合、私は提案はありません。

関連する問題