Mat*_*ton 3 c# xaml async-await uwp
我的UWP应用程序中有一个公共布尔值,用于显示/隐藏ProgressBar.我在其他地方使用了相同的模式,它似乎工作正常,但我在特定页面上遇到问题,只有在我等待异步调用后设置布尔值时才会在UI中更新它(同样的)模式作为工作页面).
这是我的XAML视图:
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<TextBlock Text="{ x:Bind Vm.IsLoaded }" Margin="112,272,-112,-272"></TextBlock>
</Grid>
Run Code Online (Sandbox Code Playgroud)
而代码隐藏:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
还有我的ViewModel.cs
public class ViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
Run Code Online (Sandbox Code Playgroud)
无论我把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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
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);
}
}
Run Code Online (Sandbox Code Playgroud)
我觉得我错过了一些非常明显的东西,但我看不到木头穿过树林,这让我疯狂.任何帮助是极大的赞赏!
我相信你遇到的问题在于你的标记.x:Bind的默认绑定模式为OneTime
; 因此,文本块中的文本在应用程序启动时绑定到IsLoaded的值,或者在文本块的数据上下文发生更改时绑定.
将绑定模式设置为OneWay
应该在异步函数返回后导致文本块更新中的值.
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<TextBlock Text="{ x:Bind Path=Vm.IsLoaded, Mode=OneWay }" Margin="112,272,-112,-272"></TextBlock>
</Grid>
Run Code Online (Sandbox Code Playgroud)
如果您有兴趣,本文将详细介绍x:Bind的使用.此外,本文还介绍了BindingMode枚举中的值.
归档时间: |
|
查看次数: |
86 次 |
最近记录: |