Не могу обратится к ListBox С# MVVM WPF

168
28 октября 2018, 17:30

Цель - сделать отчет в CSV файл.

3 папки:

  • Models
    Human.cs
  • Viewmodels
    HumanViewModel.cs
  • Views
    MainWindow.xaml

Human

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
namespace Tutorial_Wpf_MVVM.Models
{
    class Human : INotifyPropertyChanged
    {
        private string _firstname;
        private string _surname;
        private string _passport;
        private string _databirth;
        public string FirstName
        {
            get
            {
                return _firstname;
            }
            set
            {
                _firstname = value;
                OnPropertyChanged("FirstName");
            }
        }
        public string Surname
        {
            get
            {
                return _surname;
            }
            set
            {
                _surname = value;
                OnPropertyChanged("Surname");
            }
        }
        public string Passport
        {
            get
            {
                return _passport;
            }
            set
            {
                _passport = value;
                OnPropertyChanged("Passport");
            }
        }
        public string Databirth
        {
            get
            {
                return _databirth;
            }
            set
            {
                _databirth = value;
                OnPropertyChanged("Databirth");
            }
        }
        public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChanged([CallerMemberName]string prop = "")
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(prop));
        }
    }
}

HumanViewModel

class HumansViewModel : INotifyPropertyChanged
    {
        private Human _selectedhuman;
        public ObservableCollection<Human> Humans { get; set; }
        public Human SelectedHuman
        {
            get { return _selectedhuman; }
            set
            {
                _selectedhuman = value;
                OnPropertyChanged("SelectedHuman");
            }
        }
        public HumansViewModel()
        {
            Humans = new ObservableCollection<Human>
        {
            new Human { FirstName="Иван", Surname="Иванов", Passport="1111-111111",Databirth="1-1-1998"},
            new Human { FirstName="Jahseh ", Surname="Dwayne  ", Passport="2222-222222",Databirth="0-0-1990"}
        };
        }
        public void AddHuman()
        {
            Human human = new Human();
            Humans.Insert(0,human);
            SelectedHuman = human;
        }
        public void DeleteHuman()
        {
            if (_selectedhuman != null)
            {
                Humans.Remove(SelectedHuman);
            }
        }
        public void ReportingInCSV()
        {
            using (StreamWriter myOutputStream = new StreamWriter("Myfile.csv"))
            {
                foreach (var item in ReportBox.item)
                {
                    myOutputStream.WriteLine(item.ToString());
                }
            }
        }
        public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChanged([CallerMemberName]string prop = "")
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(prop));
        }
    }

View

<Window x:Class="Tutorial_Wpf_MVVM.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Tutorial_Wpf_MVVM"
        mc:Ignorable="d"
        Title="MVVM_Example" Height="350" Width="525">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
        <StackPanel Grid.Column="0" DataContext="{Binding SelectedHuman}" Grid.ColumnSpan="2" Margin="0">
            <TextBlock Text="Выбранный элемент" Margin="5,0"  />
            <TextBlock Text="Имя" Margin="5,0" />
            <TextBox Text="{Binding FirstName, UpdateSourceTrigger=PropertyChanged}" Margin="5,0" />
            <TextBlock Text="Фамилие" Margin="5,0" />
            <TextBox Text="{Binding Surname, UpdateSourceTrigger=PropertyChanged}" Margin="5,0" />
            <TextBlock Text="Паспорт(серия-номер)" Margin="5,0" />
            <TextBox Text="{Binding Passport, UpdateSourceTrigger=PropertyChanged}" Margin="5,0" />
            <TextBlock Text="Дата рождения(дд.мм.гггг)" Margin="5,0"/>
            <TextBox Text="{Binding Databirth, UpdateSourceTrigger=PropertyChanged}" Margin="5,0" />

            <Button Click="Add_Click" Margin="5,0">+</Button>
            <Button Click="Delete_Click" Margin="5,0">-</Button>
            <Button Click="ReportingInCSV" Margin="5,0">Экспорт </Button>
        </StackPanel>
        <ListBox Name="ReportBox" Grid.Column="0" Grid.Row="0" ItemsSource="{Binding Humans}"
                 SelectedItem="{Binding SelectedHuman}" Margin="0,235,0,0">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Margin="5">
                        <TextBlock Text="{Binding Path=FirstName}" />
                        <TextBlock Text="{Binding Path=Surname}" />
                        <TextBlock Text="{Binding Path=Passport}" />
                        <TextBlock Text="{Binding Path=Databirth}" />
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </Grid>
</Window>

cs

namespace Tutorial_Wpf_MVVM
{
    /// <summary>
    /// Логика взаимодействия для MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            DataContext = new HumansViewModel();
        }
        private void Add_Click(object sender, RoutedEventArgs e)
        {
            ((HumansViewModel)DataContext).AddHuman();            
        }
        private void Delete_Click(object sender, RoutedEventArgs e)
        {
            ((HumansViewModel)DataContext).DeleteHuman();
        }
        private void ReportingInCSV(object sender, RoutedEventArgs e)
        {
            ((HumansViewModel)DataContext).ReportingInCSV();
        }
    }
}

Собственно в ListBox есть информация. Цель: при нажатии на кнопку генерировать все в csv file

public void ReportingInCSV()
            {
                using (StreamWriter myOutputStream = new StreamWriter("Myfile.csv"))
                {
                    foreach (var item in ReportBox.item)
                    {
                        myOutputStream.WriteLine(item.ToString());
                    }
                }
            }

Но проблема в том что я не могу обратиться к ListBox'у. Как будто нет соответствующего модификатора. Как можно реализовать это??

READ ALSO
Исключение типа StackOverflow C#

Исключение типа StackOverflow C#

В строке определения переменной text возникает ошибка StackOverflow и не знаю как можно избавиться от его потому что условие обязательное

165
Странное поведение if-else

Странное поведение if-else

Метод обрабатывает нажатие клавишы на клавиатуре (глобальный хук) и скрывает элементы на экранеОднако почему-то после активации if(!SomeOpened)...

192
Cбой операции во время установки NLog.Configuration

Cбой операции во время установки NLog.Configuration

Cбой во время установки НЛог там говориться что оно уже установлено но как можно включить это в референсес в Visual Studio 2012 Идет попытка разрешить...

207
Математика с большими числами и Biginteger врет

Математика с большими числами и Biginteger врет

Нужно производить простые арифметические действия над большими числами на C#Использовал библиотеку System

169