0

Users:

class Users
    {
        public static DataView User { get; set; }
    }

Load:

class Load
    {
        private static string connectionString = @"Data Source=DESKTOP-DHMQJ5P;Initial Catalog=Test;Integrated Security=True";
        private static SqlConnection connection = new SqlConnection(connectionString);
        private static SqlDataAdapter adapter;
        private static DataTable dataTable = new DataTable();
        private static SqlCommand command;
        public static void getUsers()
        {
            try
            {
                using (connection)
                {
                    adapter = new SqlDataAdapter($"SELECT * FROM Users", connection);
                    adapter.Fill(dataTable);
                    Users.User = dataTable.DefaultView;
                };
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }

App.xaml.cs:

using System.Windows;

namespace Test { public partial class App : Application { private View.MainWindow mainWindow; private void Application_Startup(object sender, StartupEventArgs e) { var mainViewModel = new ViewModel.MainViewModel(); mainWindow = new View.MainWindow { DataContext = mainViewModel }; MainWindow.Show(); } }

MainViewModel:

 class MainViewModel
        {
            public MainViewModel()
            {
                Model.Load.getUsers();
            }
        }

MainWindow.xaml:

<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
            <ListView ItemsSource="{Binding Users}" Width="auto" Height="500" ScrollViewer.VerticalScrollBarVisibility="Visible" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal" Height="auto">
                            <TextBlock Text="{Binding id, StringFormat='id: {0}'}"/>
                            <TextBlock Text="{Binding name, StringFormat='Имя: {0}'}"/>
                            <TextBlock Text="{Binding second_name, StringFormat='Фамилия: {0}'}"/>
                            <TextBlock Text="{Binding patronymic, StringFormat='Отчество: {0}'}"/>
                            <TextBlock Text="{Binding date_birthday, StringFormat='Дата Рождения: {0}'}"/>
                            <TextBlock Text="{Binding phone, StringFormat='Телефон: {0}'}"/>
                            <TextBlock Text="{Binding email, StringFormat='Email: {0}'}"/>
                        </StackPanel>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
        </StackPanel>

Структура проекта

UPD: MainViewModel:

public MainViewModel()
        {
            Model.Load.getUsers();
            DataView Users = Model.Users.User;
        }
gw gw
  • 95
  • 6
  • Содержимое MainViewModel где? – EvgeniyZ Dec 11 '22 at 17:00
  • @EvgeniyZ если что ваша разработка, сейчас дополню вопрос – gw gw Dec 11 '22 at 17:03
  • Запомните одно очень важное правило в привязках каких-либо данных. Когда вы пишете {Binding Name} - это Name должно быть публичным свойством, которое должно находится в классе, который указан как DataContext. Вот теперь смотрим, вы пишете ItemsSource="{Binding Users}", то есть ссылаетесь на публичное свойство Users, далее смотрим это DataContext = mainViewModel, то есть у окна установлен DataContext на MainViewModel, а значит там должно быть public ... Users {get; set;}, где оно? И да, забудьте про статику! – EvgeniyZ Dec 11 '22 at 17:35
  • @EvgeniyZ ничего не понял, но очень интересно. Т.е в классе Users я должен написать public class Users{}? – gw gw Dec 11 '22 at 17:39
  • Чего не понятного в DataContext на MainViewModel, а значит там должно быть public ... Users {get; set;}, где оно?? Вроде прямым текстом написал кто, что и где должно быть. Если привязываете ItemsSource, то ваше свойство должно быть коллекцией, коллекцией пользователей, например public List<User> Users {get; set;}. – EvgeniyZ Dec 11 '22 at 17:50
  • @EvgeniyZ получается как-то так – gw gw Dec 11 '22 at 18:06
  • @EvgeniyZ основная проблема, что я использую DataTable для получения таблицы из бд, и сувать потом DataTable в List тяжело, много строк. Я думал, что в DataContext достаточно прописать вызов метода для получения бд и он получит, но после нескольких попыток перепрочесть ваши слова, я понял, что не так все сделал, в любом случае, сейчас по идеи все работает, но запрос не выводит данные... – gw gw Dec 11 '22 at 18:20
  • Мой вам совет - откажитесь от ADO.NET и используйте EF, если конечно у вас нет задачи учить SQL запросы. С EF вы будете сразу получать все нужное простыми LINQ запросами (допустим взять из базы всех пользователей, возраст которых больше 10, в EF будут вытягиваться примерно так var users = db.Users.Where(x=>x.Age > 10);, как видите, простые запросы, ничего лишнего). Если всеж нужна эта ужасная DataTable, то я вроде уже кидал вам пример, где есть конвертация в нормальный класс, много кода? Ну что поделать, таков ADO.NET. – EvgeniyZ Dec 11 '22 at 18:37
  • @EvgeniyZ var users = db.Users.Where(x=>x.Age > 10); что такое x – gw gw Dec 11 '22 at 18:38
  • @EvgeniyZ https://ru.stackoverflow.com/q/1476505/501401 не могли бы глянуть, пожалуйста – gw gw Dec 11 '22 at 18:39
  • Это зовется лямбдой выражения, некое условие, которое делает метод, где x это любое придуманное вами название переменной, которое будет содержать в себе конкретный объект. Допустим у нас есть коллекция List<User> Users;, мы пишем var result = Users.Where(user=>user.Age > 10);, тогда в этом случае user - это объект класса User (заметьте, в этот раз я написал не x, а user, ну а x это обычно использую как некое стандартное обозначение лямбды. – EvgeniyZ Dec 11 '22 at 18:42

0 Answers0