Silverlight MVVM Prism и OpenFileDialog - PullRequest
2 голосов
/ 17 июля 2009

В настоящее время я работаю над приложением SilverLight 3. Я использую MVVM Pattern и Prism. У меня все работает, кроме следующего пункта. На одном из моих взглядов я должен использовать OpenFileDialog. Я попытался сделать это в ViewModel только для того, чтобы выяснить, что модель безопасности SilverLight запрещает его, потому что он разрешен только по инициативе пользователя. С тех пор я переместил код OpenFileDialog в код позади View. Вот моя проблема, хотя. Хотя у меня есть привязка к источнику, установленному на 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");
                }
            }

Если я поставлю точку останова на сеттер. Это никогда не поражает это.

Ответы [ 2 ]

1 голос
/ 17 июля 2009

По крайней мере в Silverlight 2, я думаю, что следующее правило может объяснить, почему вы видите такое поведение. «Если свойство зависимости привязано и в коде свойство явно установлено в значение, то привязка удаляется». ( источник )

Может быть, это изменилось для Silverlight 3? В этом случае у меня нет предложений.

0 голосов
/ 17 июля 2009

Хорошо, это взлом, но это работает. Поскольку мне нужно запустить OpenFileDialog из пользовательского интерфейса, я могу вместо обновления элемента управления напрямую обратить привязку к DataContext для обновления свойства. Это работает и по-прежнему отображает пользовательский интерфейс так, как я ожидаю.

ПРИМЕЧАНИЕ: HACK, пока я не найду лучший способ.

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