gpt4 book ai didi

wpf - View 模型重新加载绑定(bind)数据时如何显示 'Loading...' 覆盖

转载 作者:行者123 更新时间:2023-12-04 15:47:06 26 4
gpt4 key购买 nike

我想做一些听起来非常简单,但我发现很难实现的事情。

假设我有一些内容绑定(bind)到慢速加载操作。例如,从本地 SQL 检索并需要几秒钟的可观察列表。在发生这种情况时,我想用“正在加载...”文本或任何其他“请稍候”类型的内容覆盖内容演示者(例如 Groupbox)。

我很快得出结论,在操作之前和之后简单地切换绑定(bind)到 UI 的 bool 标志是行不通的。在整个操作完成之前,UI 不会刷新。也许是因为操作是 CPU 密集型的,我不知道。

我现在正在调查 Adorner s,但得到的信息很少,我在“忙碌指示器”覆盖的上下文中搜索它。从大约 5 年前开始,互联网上只有几个解决方案,我无法让它们中的任何一个工作。

问题:

听起来很简单——如何在 View 模型正在更新绑定(bind)数据的同时在屏幕上临时显示一些东西?

最佳答案

这是一个示例,说明如何在 ViewModel\Model 处理一些长时间任务时设置具有“正在加载”显示的 View 。

窗口

<Window x:Class="Loading.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:Loading"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<local:VisibilityConverter x:Key="visibilityConverter" />
</Window.Resources>
<Window.DataContext>
<local:ViewModel x:Name="viewModel" />
</Window.DataContext>
<Grid>
<Button Content="Perform" VerticalAlignment="Bottom" HorizontalAlignment="Center" Width="100" Height="30" Command="{Binding HandleRequestCommand}" />
<Border Visibility="{Binding Path=IsLoading,Converter={StaticResource visibilityConverter}}" Background="#AAAAAAAA" Margin="5">
<TextBlock Text="Loading..." VerticalAlignment="Center" HorizontalAlignment="Center" />
</Border>
</Grid>

VisibilityConverter.cs (简单的助手转换器)
class VisibilityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return (bool)value ? Visibility.Visible : Visibility.Collapsed;
}

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}

ViewModel.cs
public class ViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;

private bool isLoading;

public ViewModel()
{
HandleRequestCommand = new Command(HandleRequest);
}

public bool IsLoading
{
get
{
return isLoading;
}
set
{
if (value != isLoading)
{
isLoading = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(IsLoading)));
}
}
}

public ICommand HandleRequestCommand
{
get;
}

public void HandleRequest()
{
IsLoading = true;

Task.Factory.StartNew(LongRunningOperation);
}

private void LongRunningOperation()
{
// *** INSERT LONG RUNNING OPERATION ***

Dispatcher.CurrentDispatcher.Invoke(() => IsLoading = false);
}
}

关于wpf - View 模型重新加载绑定(bind)数据时如何显示 'Loading...' 覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41707813/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com