2

我目前正在开发 SilverLight 3 应用程序。我正在使用 MVVM 模式和棱镜。除了以下项目,我一切正常。在我的一个观点中,我必须使用 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");
                }
            }

如果我在 Setter 上设置一个断点。它永远不会击中它。

4

2 回答 2

1

至少在 Silverlight 2 中,我认为以下规则可以解释为什么您会看到这种行为。“如果绑定了一个依赖属性,并且在代码中该属性被显式设置为一个值,则该绑定被删除。” (来源

也许这对于 Silverlight 3 有所改变?在那种情况下,我没有任何建议。

于 2009-07-17T17:50:32.577 回答
0

好的,这是一个 hack,但它有效。因为我必须从 UI 中触发 OpenFileDialog,所以我可以直接将控件反向连接到 DataContext 以更新属性,而不是直接更新控件。这有效,并且仍然以我期望的方式呈现 UI。

注意: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;
            }
        }
于 2009-07-17T18:33:34.690 回答