[WPF C#绑定元素在使用异步/等待时未更新

问题描述 投票:0回答:1

[我知道可能已经问过类似的问题,但是似乎无法在这里找到任何答案。我有空闲时间,尝试学习...

我有mvvm,带有ObservableCollection和InotifyEvent,只要在更新class属性的方法中不使用await,但只要使用await,就停止更新UI,一切都可以正常工作。

让我告诉你。

我有一个模型(课程):

public class ScreenInfo
    {
        private BitmapSource screenShot;

        public BitmapSource ScreenShot
        {
            get { return screenShot; }
            set { screenShot = value; }
        }
        ...

我有一个观点:

<Control.Resources>
        <BitmapImage x:Key="DefaultImage" UriSource="/Assets/refresh.png" />
    </Control.Resources>

    <Border>
        <ItemsControl x:Name="screenView"  ItemsSource="{Binding Screens, UpdateSourceTrigger=PropertyChanged}">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Border BorderBrush="Gray" BorderThickness=".4" Margin="10">
                        <StackPanel Orientation="Vertical"  Background="white" Width="384">
                            ...
                            <Image Source="{Binding ScreenShot, FallbackValue={StaticResource DefaultImage},
                                TargetNullValue={StaticResource DefaultImage}, Mode=OneWay}" 
                            Height="216" />
                            ...
                        </StackPanel>
                    </Border>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <WrapPanel Orientation="Horizontal"/>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
        </ItemsControl>
    </Border>

而且我有一个ViewModel:

public class PlayerViewerViewModel : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        ObservableCollection<ScreenInfo> screens;

        public PlayerViewerViewModel()
        {
            Screens = new ObservableCollection<ScreenInfo>();
        }

        public ObservableCollection<ScreenInfo> Screens
        {
            get => screens;
            set
            {
                screens = value;
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Screens"));
            }
        }
        ...

如果我运行像这样的简单方法来设置图像,则一切正常:

        public void TakeScreenShot()
        {
            try
            {
                ....                
                string picture = screen.PictureName;
                screen.ScreenShot = SSImage(picture);

            }
            catch (Exception ex)
            {
                ....
            }
        }

        private BitmapSource SSImage(string file)
        {
            BitmapImage image = new BitmapImage();
            image.BeginInit();
            image.CreateOptions = BitmapCreateOptions.IgnoreImageCache;
            image.CacheOption = BitmapCacheOption.OnLoad;
            image.UriSource = new Uri(ssPath + file);
            image.EndInit();
            return image;
        }

但是添加等待时不再更新UI。显然,我的await命令是不同的,但是仅使用此简单命令,它就无法工作。

public async Task TakeScreenShot(ScreenInfo screen)
        {
            try
            {
                string picture = screen.PictureName;
      ==>       await Task.Delay(500);
                screen.ScreenShot = SSImage(picture);

            }
            catch (Exception ex)
            {
                ....
            }
        }

我做错了什么吗?

[我知道可能已经问过类似的问题,但是似乎在这里找不到任何答案。我有空闲时间,尝试学习...我有mvvm,带有ObservableCollection ...

c# wpf mvvm data-binding observablecollection
1个回答
0
投票

您是否直接绑定到ScreenInfo.ScreenShot属性?它不会引发PropertyChanged事件。

© www.soinside.com 2019 - 2024. All rights reserved.