Silverlight MVVM Prism и OpenFileDialog

В настоящее время я работаю над приложением SilverLight 3. Я использую шаблон и призму MVVM. У меня все работает кроме следующего пункта. В одном из моих представлений я должен использовать 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");
                }
            }

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


person cjibo    schedule 17.07.2009    source источник
comment
Что такое DataContext вашего файла XAML?   -  person Robert Kozak    schedule 17.07.2009
comment
DataContext - это сама ViewModel. Он вводится Unity.   -  person cjibo    schedule 17.07.2009


Ответы (2)


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

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

person ckittel    schedule 17.07.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;
            }
        }
person cjibo    schedule 17.07.2009
comment
Назовите меня сумасшедшим, но я не считаю это взломом. Ожидается, что OpenFileDialog не будет использоваться в вашей ViewModel, и вы на самом деле не привязываетесь к вашей ViewModel, кроме привязки TextBlock к свойству в вашей ViewModel. Похоже, это уместно. - person CSharper; 23.06.2011