2

現在、SilverLight 3 アプリケーションに取り組んでいます。MVVM パターンとプリズムを使用しています。次の項目を除いて、すべてが機能しています。私のビューの 1 つで、OpenFileDialog を使用する必要があります。ViewModel でこれを実行しようとしたのは、SilverLight のセキュリティ モデルがそれを禁止していることを確認するためだけでした。それ以来、OpenFileDialog コードをビューのコード ビハインドに移動しました。ここに私の問題があります。TwoWay に設定されたソースにバインドしていますが、ViewModel のプロパティのセッターにヒットしていません。

バインディングを使用したイメージ コントロールの例:

<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" />

クリックイベント:

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

セッターにブレークポイントを置いたら。それは決して当たらない。

4

2 に答える 2

1

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

これは Silverlight 3 で変更されたのでしょうか。その場合、私からの提案はありません。

于 2009-07-17T17:50:32.577 に答える
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;
            }
        }
于 2009-07-17T18:33:34.690 に答える