UWP绑定异步加载的数据



我有两个页面,当我从第一个页面导航到另一个页面时,我会向它发送一个id(在NavigationEvent中(。然后,我在它的ViewModel上调用一个函数,该函数传递了id,并通过服务将对象异步加载到ViewModel的属性中。我在视图中绑定了对象的属性,并尝试在对象的getter中调用PropertyChanged.Invoke,但它始终为null。我该如何将我的观点与这个问题联系起来?

我要绑定的数据类:

class Dog: INotifyPropertyChanged
{
private int _name;
public int Name
{
get => _name;
set
{
_name= value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Name)));
}
}
public event PropertyChangedEventHandler PropertyChanged;
}

ViewModel:

class MyViewModel : ViewModelBase
{
public Dog Dog{ get; set; }
public MyViewModel()
{
Dog = new Dog();
}
public async void LoadDog(string id)
{
var service = newvDogService();
Dog = await service.GetDogAsync(id);
}
}

视图:

public sealed partial class DogPage : Page
{
private string dogId { get; set; }
public DogPage()
{
this.InitializeComponent();
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
dogId = e.Parameter.ToString();
ViewModel.LoadDog(dogId);
}
}

在xaml文件中:

<Page.DataContext>
<ViewModels:MyViewModel x:Name ="ViewModel"/>
</Page.DataContext>

Text="{Binding Dog.Name}"

我建议您可以简化绑定过程。对于对象绑定,不需要使用ViewModel。当你在NavigationEvent中传递id时,你可以直接通过id获得新的Dog对象。首先,你可以创建一个Name属性为null的Dog。然后,您可以通过新创建的对象更改以前的对象名称。

请参考以下代码。

Xaml代码:

<StackPanel DataContext="{x:Bind Dog,Mode=OneWay}">         
<TextBlock Text="{Binding Name,Mode=OneWay}"/>
</StackPanel>

代码背后:

public sealed partial class MainPage : Page
{

public Dog Dog { get; set; }
public MainPage()
{
this.InitializeComponent();
Dog = new Dog { Name = "" };
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
dogId = e.Parameter.ToString();
var dog = await service.GetDogAsync(dogId);
Dog.Name=dog.Name;
}

}
public class Dog : INotifyPropertyChanged
{
private string _name;
public string Name
{
get => _name;
set
{
_name = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Name)));
}
}
public event PropertyChangedEventHandler PropertyChanged;
}

最新更新