Задать вопрос
@ilykir

Почему данные из ObservableCollection не отображаются в ListView?

Помогите пожалуйста, что я делаю не правильно?
У меня есть следующий xml файл
<phones>
    <phone>
        <id>1</id>
        <title>5685</title>
        <company>VZ</company>
        <company1>MS</company1>
        <company2>RS</company2>
    </phone>
    <phone>
        <id>2</id>
        <title>6958</title>
        <company>VZ</company>
        <company1>MS</company1>
        <company2>RS</company2>
    </phone>
</phones>

Я хочу его загрузить в ObservableCollection
ObservableCollection<People> _Peoples;

private string _FileName = "Data.xml";

private void LoadData()
{
    if (File.Exists(_FileName))
    {
        using (var reader = new StreamReader(_FileName))
        {
            var xs = new XmlSerializer(typeof(ObservableCollection<People>));
            _Peoples = (ObservableCollection<People>)xs.Deserialize(reader);
            reader.Close();
        }
    }
    else
    {
        _Peoples = new ObservableCollection<People>();
    }
}
public class People
{
	public string id { get; set; }
	public string title { get; set; }
	public string company { get; set; }
	public string company1 { get; set; }
	public string company2 { get; set; }
}

И хочу его отобразить в ListView
<listView Name="listview" ItemSourse = "{Binding ElementName = window, Path= = _Peoples}">
    <ListView.View>
        <GridView>
            <GridView.Columns>
                <GridViewColumn Header = "#" Width = "125">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <TextBox Text = "{Binding id}"></TextBox>
						</DataTemplate>
					</GridViewColumn.CellTemplate>
				</GridViewColumn>
				<GridViewColumn Header = "Кому" Width = "100">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <TextBox Text = "{Binding title}" ></TextBox>
						</DataTemplate >
					</GridViewColumn.CellTemplate >
				</GridViewColumn>
				<GridViewColumn Header = "От кого" Width = "100">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <TextBox Text = "{Binding company}" ></TextBox>
						</DataTemplate >
					</GridViewColumn.CellTemplate>
				</GridViewColumn>
				<GridViewColumn Header = "Для кого" Width = "500">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <TextBox Text = "{Binding company1}" ></TextBox>
						</DataTemplate >
					</GridViewColumn.CellTemplate>
				</GridViewColumn>
				<GridViewColumn Header = "Для чего" Width = "350">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <TextBox Text = "{Binding company2}" ></TextBox>
						</DataTemplate >
					</GridViewColumn.CellTemplate>
				</GridViewColumn>
			</GridView.Columns>
		</GridView>
	</ListView.View>
</listView>

Но данные не отображаются, в чем может быть проблема?
  • Вопрос задан
  • 172 просмотра
Подписаться 2 Простой 1 комментарий
Пригласить эксперта
Ответы на вопрос 2
yarosroman
@yarosroman Куратор тега C#
C# the best
Рекомендую вам почитать о MVVM паттерне.
Ответ написан
Комментировать
FoggyFinder
@FoggyFinder
1. В WPF привязываться можно только к свойствам, у вас в коде _Peoples является полем.

2. Если вы хотите сообщать об изменении объекта то нужно использовать интерфейс INotifyPropertyChanged

ObservableCollection сообщает об своем изменении, поэтому вы можете очищать и перезаполнять коллекцию

public ObservableCollection<People> Peoples { get; } =
    new ObservableCollection<People>();


тогда метод LoadData примет примерно такой вид

private void LoadData()
{
    Peoples.Clear();
    if (File.Exists(_FileName))
    {
        using (var reader = new StreamReader(_FileName))
        {
            var xs = new XmlSerializer(typeof(People[]));
            var arr = (People[])xs.Deserialize(reader);
            foreach(var p in arr)
            {
                Peoples.Add(p);
            }
            reader.Close();
        }
    }
}


3. Если DataContext установлен правильно то вместо

ItemSourse = "{Binding ElementName = window, Path= = _Peoples}"


будет достаточно

ItemSourse = "{Binding Peoples}"

Совет: придерживайтесь принятых соглашений - никаких нижних подчеркиваний в названиях для свойств.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы