gpt4 book ai didi

c# - 如果在等待异步调用后设置 UWP bool 值,则不会在 UI 中更新

转载 作者:行者123 更新时间:2023-11-30 14:23:26 24 4
gpt4 key购买 nike

我的 UWP 应用程序中有一个公共(public) bool 值,用于显示/隐藏 ProgressBar。我在其他地方使用了相同的模式,它似乎工作正常,但我在特定页面上遇到问题,它似乎没有在 UI 中更新仅当我设置了 bool 值在等待的异步调用之后(与工作页面相同的模式)。

这是我的 XAML View :

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<TextBlock Text="{ x:Bind Vm.IsLoaded }" Margin="112,272,-112,-272"></TextBlock>
</Grid>

以及代码隐藏:

public sealed partial class MainPage : Page
{
public MainPageViewModel Vm => DataContext as MainPageViewModel;
public MainPage()
{
this.InitializeComponent();
this.DataContext = new MainPageViewModel();
}

protected override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);

Vm.GetProjectData();
}
}

这是我的 MainPageViewModel.cs

public class MainPageViewModel : ViewModel
{
public ObservableCollection<Project> Projects { get; set; } = new ObservableCollection<Project>();

private bool _isLoaded;
public bool IsLoaded
{
get { return _isLoaded; }
set
{
_isLoaded = value;
OnPropertyChanged();
}
}

public async Task GetProjectData()
{
// If I put `IsLoaded = true;` here it displays `true` in the UI
var projectsResponse = await HttpUtil.GetAsync(StringUtil.ProjectsUrl());
// If I put `IsLoaded = true;` here it still displays `false` in the UI
if (projectsResponse.IsSuccessStatusCode)
{
var projectsResponseString = await projectsResponse.Content.ReadAsStringAsync();
var projects = JsonUtil.SerializeJsonToObject<List<Project>>(projectsResponseString);

foreach (var project in projects)
{
Projects.Add(project);
}

IsLoaded = true;
}
}
}

还有我的 ViewModel.cs

public class ViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;

protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}

无论我将 IsLoaded = true; 放在哪里,它总是触发 OnPropertyChanged()。

这是我的工作代码:

ProjectViewViewModel.cs:

public class ProjectViewViewModel : ViewModel
{
public ObservableCollection<Story> MyData { get; set; } = new ObservableCollection<Story>();
private bool _dataIsLoaded;
public bool DataIsLoaded
{
get { return _dataIsLoaded; }
set
{
_dataIsLoaded = value;
OnPropertyChanged();
}
}

public async Task GetData(Project project)
{
DataIsLoaded = false;
var stringResponse = await HttpUtil.GetAsync(StringUtil.Query(project.Id, "MB"));
if (stringResponse.IsSuccessStatusCode)
{
// Do Stuff

DataIsLoaded = true;
}
}
}

ProjectView.xaml.cs

public sealed partial class ProjectView : Page
{
public Project Project { get; set; }
public bool IsLoaded { get; set; }
public ProjectViewViewModel Vm => DataContext as ProjectViewViewModel;
public ProjectView()
{
this.InitializeComponent();
this.DataContext = new ProjectViewViewModel();
}

protected override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);

Project = e.Parameter as Project;
Vm.GetData(Project);
}
}

我觉得我错过了一些非常明显的东西,但我看不到树林中的树林,这让我抓狂。非常感谢任何帮助!

最佳答案

我相信您遇到的问题是您的标记。 x:Bind 默认绑定(bind)模式为OneTime;因此文本 block 中的文本在应用程序启动时或文本 block 的数据上下文更改时绑定(bind)到 IsLoaded 的值。

将绑定(bind)模式设置为 OneWay 应该会在异步函数返回后更新文本 block 中的值。

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<TextBlock Text="{ x:Bind Path=Vm.IsLoaded, Mode=OneWay }" Margin="112,272,-112,-272"></TextBlock>
</Grid>

如果您有兴趣,this article详细介绍了 x:Bind 的使用。另外,this article涵盖 BindingMode 枚举中的值。

关于c# - 如果在等待异步调用后设置 UWP bool 值,则不会在 UI 中更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45444167/

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