-
“WeakReferenceMessenger” 支持应用程序的不同部分之间的通信,而无需在对象之间创建强引用。它使用弱引用来避免内存泄漏。
-
我们接着上一篇后半部分的代码,对MyViewModel进行修改,添加一个方法,将新用户添加到集合中,并通知绑定到主页CollectionView中。
-
首先添加新用户命令,并给它一个可执行约束。
-
[RelayCommand(CanExecute = nameof(CanAddUser))]
private void AddUser()
{
if (Users!=null)
{
// 新增用户
Users.Add(new User()
{
Id = Users.Count,
Name = "新用户"
});
WeakReferenceMessenger.Default.Send(Users.Last());
}
}
private bool CanAddUser() => Users != null;
-
修改ObservableCollection<User> users
[ObservableProperty]
[NotifyCanExecuteChangedFor(nameof(AddUserCommand))]
private ObservableCollection<User> users;
-
修改模拟服务初始化一些数据
public static class DummyService
{
public static async Task<IEnumerable<User>> GetUsersAsync()
{
await Task.Delay(5000);
var users = new List<User>();
for (var i = 0; i < 30; i++)
{
users.Add(new User()
{
Id = i,
Name = "用户"
});
}
return users;
}
}
-
在主页加入一个添加新用户的按钮
<Grid RowDefinitions="50,*">
<Button Text="添加新用户"
Command="{Binding AddUserCommand}"/>
<CollectionView ItemsSource="{Binding Users}"
x:Name="UsersCollectionView"
Grid.Row="1">
<CollectionView.ItemTemplate>
<DataTemplate
x:DataType="vm:User">
<HorizontalStackLayout>
<Label Text="{Binding Id}"/>
<Label Text="{Binding Name}"/>
</HorizontalStackLayout>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
<ActivityIndicator
HorizontalOptions="Center"
VerticalOptions="Center"
Grid.Row="1"
IsRunning="{Binding InitializeCommand.IsRunning}"/>
</Grid>
-
在隐藏代码中使用WeakReferenceMessenger注册服务
public MainPage()
{
InitializeComponent();
WeakReferenceMessenger.Default.Register<User>(this, (r,user) =>
{
UsersCollectionView.ScrollTo(user);
});
}
IOS下运行程序
465

被折叠的 条评论
为什么被折叠?



