[我知道可能已经问过类似的问题,但是似乎无法在这里找到任何答案。我有空闲时间,尝试学习...
我有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 ...
您是否直接绑定到ScreenInfo.ScreenShot属性?它不会引发PropertyChanged事件。