Wpf图像控件(绑定属性)在第一次后不会刷新

3
控件只显示第一张图片,如果属性更改(并触发事件),控件甚至不会再次尝试获取该值。 如果在窗口初始化时属性为null,则什么也不显示,即使稍后设置了图像也是如此。 该图像大约为2MB位图。
这是XAML代码:
<Image
    Grid.Row="1" 
    Grid.Column="0" 
    Grid.ColumnSpan="2"    
    Source="{Binding Path=CurrentImg,UpdateSourceTrigger=PropertyChanged, Mode= TwoWay}"/>

以下是视图模型代码:

private BitmapImage _CurrentImg;

public BitmapImage CurrentImg
{
    get { return _CurrentImg; }
    set
    {
        _CurrentImg = value;
        RaisePropertyChanged("CurrentImg");
    }
}

public void ButtonCommandExecute()
{
    TestAlgo.Next();

    this.CurrentImg = TestAlgo.toWpfBitmapImage();  
}

最后,这是从System.Drawing.Bitmap创建BitmapImage的方法。

 public BitmapImage toWpfBitmapImage()
    { return convertBitmapToBitmapSource(this.CurBitmap); }

    /// <summary>
    /// Converts a <see cref="System.Drawing.Bitmap"/> to <see cref="System.Windows.Media.Imaging.BitmapSource"/>
    /// </summary>
    /// <param name="bitmap">Source</param>
    /// <returns>Converted image</returns>
    public static BitmapImage convertBitmapToBitmapSource(System.Drawing.Bitmap bitmap)
    {


        //salvo la bitmap nel MemoryStream, in modo che lo posso usare come sorgente per una nuova BitmapSource
        BitmapImage imageToReturn = new BitmapImage();
        using (MemoryStream stream = new MemoryStream())
        {


            bitmap.Save(stream, System.Drawing.Imaging.ImageFormat.Bmp);
            //creo la nuova BitmapSource da ritornare
            stream.Seek(0, SeekOrigin.Begin);
            imageToReturn.BeginInit();
            imageToReturn.CacheOption = BitmapCacheOption.OnLoad;
            imageToReturn.CreateOptions = BitmapCreateOptions.PreservePixelFormat;
            imageToReturn.StreamSource = stream;
            imageToReturn.EndInit();
        }
        return imageToReturn;

    }

这是主窗口实例化的地方,视图模型作为参数传递,并在构造函数中设置。
    public partial class App : Application
    {
        MainWindowVM MainWinVM;
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);
            MainWinVM = new MainWindowVM();
            MainWindow win = new MainWindow(MainWinVM);
            win.Show();
        }
        protected override void OnExit(ExitEventArgs e)
        {
            MainWinVM.SaveDb();
            base.OnExit(e);
        }
    }


     public partial class MainWindow : Window
     {
       public MainWindow()
       {
          this.DataContext = new MainWindowVM();
          InitializeComponent();

       }
       public MainWindow(MainWindowVM vm)
       {
          DataContext = vm;
          InitializeComponent();

       }
     }

1
所以 ButtonCommandExecute 执行正常,但图像没有改变?CurrentImg 属性是什么样子的? - dkozl
确切地说,我更新了代码。 属性值更改事件被触发,但 get{} 永远不会被调用。 当窗口的数据上下文设置后,get 方法仅被调用一次,然后再也不会被调用。 - Frabu
ButtonCommandExecute 是否会异步执行,还是所有操作都在 UI 线程上进行? - dkozl
1
@N4rk0 你解决了这个问题吗?我也遇到了同样的问题,但是一直没有找出为什么在 PropertyChange 通知之后 get; 没有被调用。 - AdvApp
@N4rk0 我找到了答案:我忽略了在VM类中继承INotifyPropertyChanged。我已经添加了代码,但没有进行子类化。哎呀! - AdvApp
显示剩余5条评论
1个回答

1

1
是的,我有: private BitmapImage _CurrentImg; public BitmapImage CurrentImg { get { return _CurrentImg; } set { _CurrentImg = value; RaisePropertyChanged("CurrentImg"); } } - Frabu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接