C# Xamarin列表视图SelectedItem ViewModel绑定
使用Visual Studio 2015 proff 我的LoginView模型类(可移植类库) 问题 我得到一份员工名单,前端的名单显示了这一点。然后,用户从列表中选择一个名称,此时我希望检测到该名称,然后导航到我的不同页面。 目前我的属性没有命中,我想知道这是否与我在“OnAppearing”后面的代码绑定有关?但我不确定C# Xamarin列表视图SelectedItem ViewModel绑定,c#,xamarin,C#,Xamarin,使用Visual Studio 2015 proff 我的LoginView模型类(可移植类库) 问题 我得到一份员工名单,前端的名单显示了这一点。然后,用户从列表中选择一个名称,此时我希望检测到该名称,然后导航到我的不同页面。 目前我的属性没有命中,我想知道这是否与我在“OnAppearing”后面的代码绑定有关?但我不确定 mylist.ItemSelected += async (sender, e) => { if (e.SelectedItem == n
mylist.ItemSelected += async (sender, e) => {
if (e.SelectedItem == null) return;
await Navigation.PushAsync(new MenuPage());
};
这是可行的,必须在App.cs中将页面设置为导航换行,然后将此事件处理程序应用于OnAppearing方法。虽然您所做的可能有效,但我建议进行一些调整 无需在构造函数和出现()中设置
BindingContext
。只需将LoginViewModel
设置为代码隐藏中的类级私有属性,并仅将其分配给构造函数中的BindingContext
。然后调用OnAppearing()
中的GetEmployees()
此外,您还应该让GetEmployees()
返回一个任务
,以便尽可能地在链的上游等待
视图模型:
....
public async Task GetEmployees()
{
var loginService = new LoginService();
EmployeeList = await loginService.GetEmployeesAsync();
}
....
代码隐藏:
public partial class LoginPage : ContentPage
{
private LoginViewModel _model;
public LoginPage()
{
InitializeComponent();
BindingContext = _model = new LoginViewModel(this);
}
protected override async void OnAppearing() //Notice I changed this to async and can now await the GetEmployees() call
{
base.OnAppearing();
await _model.GetEmployees();
}
public ListView MyList
{
get
{
return mylist;
}
}
private async void OnItemSelected(object sender, SelectedItemChangedEventArgs e) {
if (e.SelectedItem == null) return;
await Navigation.PushAsync(new MenuPage());
}
}
XAML:
非常感谢代码清理,周末后我会进行测试
mylist.ItemSelected += async (sender, e) => {
if (e.SelectedItem == null) return;
await Navigation.PushAsync(new MenuPage());
};
....
public async Task GetEmployees()
{
var loginService = new LoginService();
EmployeeList = await loginService.GetEmployeesAsync();
}
....
public partial class LoginPage : ContentPage
{
private LoginViewModel _model;
public LoginPage()
{
InitializeComponent();
BindingContext = _model = new LoginViewModel(this);
}
protected override async void OnAppearing() //Notice I changed this to async and can now await the GetEmployees() call
{
base.OnAppearing();
await _model.GetEmployees();
}
public ListView MyList
{
get
{
return mylist;
}
}
private async void OnItemSelected(object sender, SelectedItemChangedEventArgs e) {
if (e.SelectedItem == null) return;
await Navigation.PushAsync(new MenuPage());
}
}
<!-- Adding OnItemSelected in XAML below -->
<ListView x:Name="mylist"
ItemsSource="{Binding EmployeeList}"
HasUnevenRows="True"
SelectedItem="{Binding LoginName}"
ItemSelected="OnItemSelected">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<StackLayout Orientation="Vertical" Padding="12,6">
<Label Text="{Binding Name}"/>
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>