Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
 
griboyedov
0 / 0 / 14
Регистрация: 28.12.2013
Сообщений: 107
#1

MVVA байндинг - C# WPF

13.12.2017, 19:58. Просмотров 150. Ответов 7
Метки нет (Все метки)

Добрый день, форумчане! Реализовываю приложение, но не получается реализовать байндинг.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
    public class ShowPeopleViewModel
    {
        public ShowPeopleViewModel()
        {
            ShowPeople();
        }
        public async Task ShowPeople()
        {
          // Получение списка людей происходит успешно
        }
        public List<PersonModel> People { get; set; }
 
    }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    public partial class NameSearchWindow : Window
    {
        public NameSearchWindow()
        {
            InitializeComponent();
        }
 
 
        private void OKButton_Click(object sender, RoutedEventArgs e)
        {
            ShowPeopleWindow Window = new ShowPeopleWindow();
            Window.Show();
            this.Close();
        }
    }

C#
1
2
3
4
5
6
7
8
    public partial class ShowPeopleWindow : Window
    {
        public ShowPeopleWindow()
        {
            InitializeComponent();
            DataContext = new ShowPeopleViewModel();
        }
    }
C#
1
2
3
4
    public class PersonModel
    {
        public string Name { get; set; }
    }
XML
1
2
3
4
        <ListBox HorizontalAlignment="Center" Height="190" Grid.Row="1" VerticalAlignment="Center" Width="244" ItemsSource="{Binding People}">
            <TextBlock Text="{Binding Path=Name}"></TextBlock>
            
        </ListBox>

http://www.cyberforum.ru/wpf-silverlight/thread1117687.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Gekr
41 / 42 / 31
Регистрация: 01.10.2012
Сообщений: 185
Завершенные тесты: 1
13.12.2017, 22:07 #2
1. MVVM*
2. Реализовать INotifyPropertyChanged для модели

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 public class PersonModel : INotifyPropertyChanged
    {
        private string name;
 
        public string Name {
         get
            {
                return name;
            }
 
            set
            {
                if (value != name)
                {
                    name = value;
                    NotifyPropertyChanged();
                }
            }
        }
 
        public event PropertyChangedEventHandler PropertyChanged;
 
        private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
3. Земенить List<T> на ObservableCollection<T>

C#
1
public  ObservableCollection<PersonModel> People { get; set; }
0
jcp
99 / 21 / 12
Регистрация: 12.12.2013
Сообщений: 197
Записей в блоге: 1
Завершенные тесты: 1
14.12.2017, 07:39 #3
Цитата Сообщение от griboyedov Посмотреть сообщение
Реализовываю приложение, но не получается реализовать байндинг.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
    public partial class NameSearchWindow : Window
    {
        public NameSearchWindow()
        {
            InitializeComponent();
        }
        private void OKButton_Click(object sender, RoutedEventArgs e)
        {
            ShowPeopleWindow Window = new ShowPeopleWindow();
            Window.Show();
            this.Close();
        }
    }
Уходите уже от code-behind, если используете WPF.
0
Duzekrutov
23 / 23 / 2
Регистрация: 22.01.2013
Сообщений: 243
14.12.2017, 09:28 #4
не байдинг а биндинг...
0
griboyedov
0 / 0 / 14
Регистрация: 28.12.2013
Сообщений: 107
14.12.2017, 20:20  [ТС] #5
Что-то не получилось. Поменял код на такой:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 public class PersonModel : INotifyPropertyChanged
    {
        private string name;
 
        public string Name {
         get
            {
                return name;
            }
 
            set
            {
                if (value != name)
                {
                    name = value;
                    NotifyPropertyChanged();
                }
            }
        }
 
        public event PropertyChangedEventHandler PropertyChanged;
 
        private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
Всё равно ListBox пустой, хотя во ViewModel, получаю список людей.
0
Gekr
41 / 42 / 31
Регистрация: 01.10.2012
Сообщений: 185
Завершенные тесты: 1
14.12.2017, 22:33 #6
ViewModel в студию

Плюс в View добавить

C#
1
2
3
4
5
6
7
8
9
<ListBox HorizontalAlignment="Center" Height="190" Grid.Row="1" VerticalAlignment="Center" Width="244" ItemsSource="{Binding People}">
<ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                     <TextBlock Text="{Binding Path=Name}"></TextBlock>
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
0
griboyedov
0 / 0 / 14
Регистрация: 28.12.2013
Сообщений: 107
15.12.2017, 09:56  [ТС] #7
Gekr, посмотрите, пожалуйста.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
    public class ShowPeopleViewModel
    {
 
        public ShowPeopleViewModel()
        {
            ShowPeople();
        }        
 
        public  async Task ShowPeople()
        {
            using (var client = new HttpClient())
            {
                client.BaseAddress = new Uri("http://localhost:50825");
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
 
                HttpResponseMessage response;
 
                response = await client.GetAsync("api/People");
                if (response.IsSuccessStatusCode)
                {
                    People = await response.Content.ReadAsAsync<ObservableCollection<PersonModel>>();
                }
            };
        }
        public ObservableCollection<PersonModel> People { get; set; }
 
    }
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<Window x:Class="DesktopClient.ShowPeopleWindow"
        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:DesktopClient"
        mc:Ignorable="d"
Title="ShowPeople" Height="300" Width="300">
    <Grid >
        <Grid.RowDefinitions>
            <RowDefinition Height="27*"></RowDefinition>
            <RowDefinition Height="246*"></RowDefinition>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
 
        </Grid.ColumnDefinitions>
        <ListBox HorizontalAlignment="Center" Height="190" Grid.Row="1" VerticalAlignment="Center" Width="244" ItemsSource="{Binding People}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{Binding Path=Name}"></TextBlock>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
 
 
    </Grid>
 
</Window>
0
Gekr
41 / 42 / 31
Регистрация: 01.10.2012
Сообщений: 185
Завершенные тесты: 1
15.12.2017, 11:58 #8
Попробуйте инициализировать коллекцию. Если не помогло, значит что-то не так с Response.Result
0
Миниатюры
MVVA байндинг  
15.12.2017, 11:58
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru