Как установить 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 и это работает, если я делаю следующее изменения:
- добавление
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>
Конечно, вы должны изменить имена, чтобы они соответствовали вашему проекту.
- отображение списка
Я удалил IsVisible
и ItemSelected
.
<ListView ItemsSource="{x:Static local:App.myListOfEmployeeObjects}">
- сделайте все статичным
Он должен быть статичным, иначе получится
Статический член не найден для местный:приложение.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 ответа:
Так что я на самом деле не удосужился сделать это сам, но из чтения документации у меня есть предложение, которое, возможно, стоит попробовать.
ItemsSource="{x:Static local:App.myListOfEmployeeObjects}"
В вашем xaml вы сказали, что источник статичен, но смотрит на ваш .файл CS это не так. Попробуйте следующее:
public static List<Employee> myListOfEmployeeObjects { private set; get; }
А затем попробуйте установить объект с помощью статической функции, например.:
static App() { myListOfEmployeeObjects = something; }
Тогда список должен быть доступен для просмотра на странице.
Я использовал следующие ссылки, которые вы можете найти полезно:
Надеюсь, это поможет.
Я думаю, что у меня есть решение для вашей проблемы. У меня была та же проблема, и я добавил эту строку в 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" >