Как установить ItemsSource из ListView?


Здесь я определил мои данные myListOfEmployeeObjects :

public class App : Application
{
    public List<Employee> myListOfEmployeeObjects;

    public App ()
    {
        Employee emp1 = new Employee () {
            FirstName = "Max",
            LastName = "Mustermann",
            Twitter = "@fake1"
        };
        Employee emp2 = new Employee () {
            FirstName = "Evy",
            LastName = "Mustermann",
            Twitter = "@fake2"
        };
        myListOfEmployeeObjects = new List<Employee> {
            emp1, emp2
        };
        MainPage = new NavigationPage (new EmployeeListPage ());
    }
}

Чем у меня есть мой XAML, где я устанавливаю ItemsSource:

<ListView x:Name="listView"
                IsVisible="false"
                ItemsSource="{x:Static local:App.myListOfEmployeeObjects}"
                ItemSelected="EmployeeListOnItemSelected">
Должно ли это сработать? Потому что я получаю

Xamarin.Формы.код XAML.XamlParseException: тип App не найден в xmlns

public partial class EmployeeListPage : ContentPage {

    private ListView listView;

    private void InitializeComponent() {
        this.LoadFromXaml(typeof(EmployeeListPage)); // here the exception is thrown
        listView = this.FindByName <ListView>("listView");
    }
}

Как я могу задать ItemsSource моего XAML?

Редактировать:

Теперь я попробовал предложение от пользователь2425632 и это работает, если я делаю следующее изменения:

  1. добавление xmlns:local="clr-namespace:HelloXamarinFormsWorld;assembly=HelloXamarinFormsWorld" в мой XAML-файл

Теперь это выглядит следующим образом

<?xml version="1.0" encoding="UTF-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:HelloXamarinFormsWorld;assembly=HelloXamarinFormsWorld"
             x:Class="HelloXamarinFormsWorld.EmployeeListPage"
             Title="Employee List">
    <ContentPage.Content>

Конечно, вы должны изменить имена, чтобы они соответствовали вашему проекту.

  1. отображение списка

Я удалил IsVisible и ItemSelected.

<ListView ItemsSource="{x:Static local:App.myListOfEmployeeObjects}">
  1. сделайте все статичным

Он должен быть статичным, иначе получится

Статический член не найден для местный:приложение.myListOfEmployeeObjects

public static List<Employee> myListOfEmployeeObjects { private set; get; }

public static void GetAllEmployees(){
    Employee emp1 = new Employee () {
        FirstName = "Max",
        LastName = "Mustermann",
        Twitter = "@fake1"
    };
    Employee emp2 = new Employee () {
        FirstName = "Eva",
        LastName = "Mustermann",
        Twitter = "@fake2"
    };
    myListOfEmployeeObjects = new List<Employee> {
        emp1, emp2
    };
}

public App ()
{
    GetAllEmployees ();
    MainPage = new NavigationPage (new EmployeeListPage ());
}
3 6

3 ответа:

Так что я на самом деле не удосужился сделать это сам, но из чтения документации у меня есть предложение, которое, возможно, стоит попробовать.

ItemsSource="{x:Static local:App.myListOfEmployeeObjects}"

В вашем xaml вы сказали, что источник статичен, но смотрит на ваш .файл CS это не так. Попробуйте следующее:

public static List<Employee> myListOfEmployeeObjects { private set; get; }

А затем попробуйте установить объект с помощью статической функции, например.:

static App() {
    myListOfEmployeeObjects = something;
}

Тогда список должен быть доступен для просмотра на странице.

Я использовал следующие ссылки, которые вы можете найти полезно:

Документация Xamarin по привязке данных

Пример кода cs

Пример кода xaml

Надеюсь, это поможет.

Я думаю, что у меня есть решение для вашей проблемы. У меня была та же проблема, и я добавил эту строку в EmployeeListPage.xaml:

xmlns:local="clr-namespace:YourNamespace;assembly=YourAssembly"

Вы получите имя сборки в свойствах вашего проекта и пространство имен на любой странице.cs

Вы можете использовать ObservableCollections. Этот тип коллекции уведомляет, когда в нее вносятся изменения.

В вашем коде:

.cs:

public class YourClass : INotifyPropertyChanged //Note this INotifyPropertyChanged
{

    private ObservableCollection<Employee> _myListOfEmployeeObjects;
    public ObservableCollection<Employee> ObservableEmployees
    {
        get
        {
            if (_myListOfEmployeeObjects == null) LoadEmployees();
            return _myListOfEmployeeObjects;
        }
        set
        {
            _myListOfEmployeeObjects = value;
            OnPropertyChanged("ObservableEmployees");
        }
    }

     private void LoadEmployees()
    {
        // Necessary stuff to load employees
        ObservableEmployees = new ObservableCollection<Employees>();
        ....
    }

Необходимо добавить DataContext = this в конструктор по умолчанию:

public YourClass()
{
    InitializeComponent();
    DataContext = this;
}

И затем добавьте необходимый метод к NotifyOnPropertyChanged:

 protected virtual void OnPropertyChanged(string propertyName)
 {
    PropertyChangedEventHandler handler = PropertyChanged;
    if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
 }

В вашем .xaml:

<ListView x:Name="listView"
    IsVisible="false"
    ItemsSource="{Binding Path=ObservableEmployees, ElementName=EmployeesWindow, NotifyOnSourceUpdated=True}"
    ItemSelected="EmployeeListOnItemSelected">

В ElementName=EmployeesWindow, EmployeesWindow является вашим главным окном x:Name.

<Window ...
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"                      
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Name="EmployeesWindow" >