Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > WPF, UWP, WinRT, XAML
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.10.2012, 12:22   #1
Dophin
Форумчанин
 
Аватар для Dophin
 
Регистрация: 13.01.2010
Сообщений: 410
По умолчанию Обновить датагрид

День добрый.

Есть датагрид:

Код:
<DataGrid AutoGenerateColumns="False" Height="133" HorizontalAlignment="Left" Margin="21,26,0,0" Name="dataGrid1" VerticalAlignment="Top" Width="212" >
            <DataGrid.Columns>
                <DataGridTextColumn Header="id" Binding="{Binding Name}" Width="100"  />
                <DataGridTextColumn Header="Слово" Binding="{Binding Age}" Width="100" />
            </DataGrid.Columns>
</DataGrid>

есть класс
Код:
 public class Man
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }
есть кнопка1 для заполнения данного грида экземплярами этого класса
Код:
private void button1_Click ( object sender, RoutedEventArgs e )//заполнить грид
        {
            List<Man> myListMane = new List<Man> ();
            Random rnd = new Random ();
            for (int i = 1; i < 100; i++)
            {
                Man tmpMan = new Man ();
                tmpMan.Name = "man" + i;
                tmpMan.Age = rnd.Next ( 1, 90 );
                myListMane.Add ( tmpMan );
            }
            dataGrid1.ItemsSource = myListMane;
        }
и есть кнопка2 изменения выделенного на гриде экземпляра
Код:
 private void button2_Click ( object sender, RoutedEventArgs e )
        {
            ((Man)dataGrid1.SelectedItem).Age = 999;
        }
Если выделить строку и нажать на кнопку2, то на гриде ничего не изменяется. Если мышкой проскроллить список и вернуться обратно - выделенная строка грида изменится.

Вопрос: как сделать чтобы строка менялась сразу после нажатия на кнопку2?

Заранее большое спасибо.
Dophin вне форума Ответить с цитированием
Старый 11.10.2012, 12:31   #2
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

1) Реализовать интерфейс INotifyPropertyChanged у класса Man
2) После изменения св-ва Age вызывать PropertyChanged для Age из редактируемого экземпляра класса Man

Пример измененного класса Man:
Код:
public class Man : INotifyPropertyChanged
    {
        private string _name;
        private int _age;

        public string Name
        {
            get { return _name; }
            set
            {
                _name = value;
                OnPropertyChanged("Name");
            }
        }

        public int Age
        {
            get { return _age; }
            set
            {
                _age = value;
                OnPropertyChanged("Age");
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        private void OnPropertyChanged(string propertyName)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
P.S. и SelectedItem тоже можно получать через Binding, и ItemsSource гриду отдавать через него же. попробуйте, вам понравится)
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 11.10.2012, 12:35   #3
Dophin
Форумчанин
 
Аватар для Dophin
 
Регистрация: 13.01.2010
Сообщений: 410
По умолчанию

Спасибо большое)
Dophin вне форума Ответить с цитированием
Старый 11.10.2012, 13:08   #4
Dophin
Форумчанин
 
Аватар для Dophin
 
Регистрация: 13.01.2010
Сообщений: 410
По умолчанию

Цитата:
Сообщение от Luuzuk Посмотреть сообщение

P.S. и SelectedItem тоже можно получать через Binding, и ItemsSource гриду отдавать через него же. попробуйте, вам понравится)
Побоюсь показаться назойливым, но не могли бы вы дать маааленький примерчик как это делать, что хоть понимать куда смотреть. Заранее спасибо.
Dophin вне форума Ответить с цитированием
Старый 11.10.2012, 13:26   #5
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Как называется ваша форма я не знаю. Буду считать, что Form1

Код:

<!-- в XAML коде формы (Form1.xaml)-->
...
<DataGrid ..... ItemsSource={Binding People} SelectedItem={Binding SelectedPeople, Mode=TwoWay}>
...


<!-- в Form1.xaml.cs -->
public partial class Form1 : INotifyPropertyChanged // Интерфейс реализовать обязательно!
{
        // Реализация интерфейса
        public event PropertyChangedEventHandler PropertyChanged;
        private void OnPropertyChanged(string propertyName)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
        }
		
		private ObservableCollection<Man> _people;
		// Свойство для биндинга набора людей
		public ObservableCollection<Man> People
		{
		   get { return _people; }
		   set
                       {
                          _people = value;
                          OnPropertyChanged("People");
                       }
		}		
		
		private Man _selectedPeople;
		// Свойство для биндинга выделенного человека
		public Man SelectedPeople
		{
		   get { return _people; }
		   set
                     {
                       _people = value;
                       OnPropertyChanged("SelectedPeople");
                       }
                  }
		
		// Конструктор формы
		public Form1()
		{
		  this.DataContext = this; // Указываем контекст данных для биндинга
		  .....
		}	
		
	private void button1_Click ( object sender, RoutedEventArgs e )//заполнить грид
        {
            ObservableCollection<Man> myListMane = new ObservableCollection<Man> ();
            Random rnd = new Random ();
            for (int i = 1; i < 100; i++)
            {
                Man tmpMan = new Man ();
                tmpMan.Name = "man" + i;
                tmpMan.Age = rnd.Next ( 1, 90 );
                myListMane.Add ( tmpMan );
            }
			People = myListMane; // В этот момент отработает PropertyChanged и данные покажутся в гриде
        }
		
	private void button2_Click ( object sender, RoutedEventArgs e )
        {
		    // SelectedPeople содержит выделеную запись
		    if (SelectedPeople != null)
              SelectedPeople.Age = 999;
        }
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 11.10.2012, 13:40   #6
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,022
По умолчанию

Цитата:
ObservableCollection<Man> myListMane = new ObservableCollection<Man> ();
Зачем? сразу в поле, выж лист заменили
eval вне форума Ответить с цитированием
Старый 11.10.2012, 14:44   #7
Dophin
Форумчанин
 
Аватар для Dophin
 
Регистрация: 13.01.2010
Сообщений: 410
По умолчанию

Спаибо. Буду разбираться )
Dophin вне форума Ответить с цитированием
Старый 11.10.2012, 15:09   #8
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Цитата:
Сообщение от eval Посмотреть сообщение
Зачем? сразу в поле, выж лист заменили
Я бы порекомендовал обойтись одной полной заменой коллекции People (и одним вызовом PropertyChanged), чем кучей добавлений элементов в People и, соответственно, кучей CollectionChanged на каждом People.Add().
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 11.10.2012, 15:42   #9
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,022
По умолчанию

Ловля блох, все равно будет цикл и соотв. обработка, так что где будет выйгрыш, еще вопрос.
eval вне форума Ответить с цитированием
Старый 11.10.2012, 16:50   #10
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Не ловля блох, а потенциальная цикличная перерисовка датагрида, т.к. в вашем варианте он будет получать оповещения об изменении коллекции при каждом добавлении нового элемента. В сильверлайте листбокс со сложным ItemTemplate при таком над собой насилии иногда даже падает (случай из недавней практики).
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вставить запрос sql в датагрид shimetoya C# (си шарп) 4 04.05.2011 20:56
Обновить DC liljon Win Api 2 20.04.2010 10:29
Обновить Timage ScorpioN_T Компоненты Delphi 8 15.05.2009 02:26
Как обновить?? Vremya-Dengy Общие вопросы Delphi 6 17.02.2009 22:44