C# Xamarin列表视图SelectedItem ViewModel绑定

C# Xamarin列表视图SelectedItem ViewModel绑定,c#,xamarin,C#,Xamarin,使用Visual Studio 2015 proff 我的LoginView模型类(可移植类库) 问题 我得到一份员工名单,前端的名单显示了这一点。然后,用户从列表中选择一个名称,此时我希望检测到该名称,然后导航到我的不同页面。 目前我的属性没有命中,我想知道这是否与我在“OnAppearing”后面的代码绑定有关?但我不确定 mylist.ItemSelected += async (sender, e) => { if (e.SelectedItem == n

使用Visual Studio 2015 proff

我的LoginView模型类(可移植类库)

问题

我得到一份员工名单,前端的名单显示了这一点。然后,用户从列表中选择一个名称,此时我希望检测到该名称,然后导航到我的不同页面。 目前我的属性没有命中,我想知道这是否与我在“OnAppearing”后面的代码绑定有关?但我不确定

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>