Как установить ItemsSource of 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: Тип приложения не найден в 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?
Edit:
теперь я попробовал предложение от user2425632 и это работает, если я делаю следующие изменения:
- добавлять
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}">
- сделать все static
он должен быть статическим, иначе вы получите
статический член не найден для local: App.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;
}
в списке будут отображаться на странице.
я использовал следующие ссылки который вы можете найти полезным:
документация Xamarin по привязке данных
надеюсь, что это поможет.
Я думаю, что у меня есть решение вашей проблемы. У меня была такая же проблема, и я добавил эту строку в 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" >