Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: ListView в WPF Добавлено: 28.06.10 23:12  

Автор вопроса:  s12
Гм. Как программно редактировать ListItems в листвьюшке? В WinForms есть SubItems куда его сныкали мелкомягкие в WPF?
Эта конструкция редактирует все столбцы в указанной строке:
NewListView.Items[1] = "Бла-бла-бла";

Ответить

  Ответы Всего ответов: 12  

Номер ответа: 1
Автор ответа:
 s12



Вопросов: 24
Ответов: 363
 Профиль | | #1 Добавлено: 28.06.10 23:31
А если мне надо отредактировать второй столбец в четвертой строке, как быть?

Ответить

Номер ответа: 2
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #2 Добавлено: 29.06.10 08:23
Поищи в гугле, по-моему ListView делается через Grid

Ответить

Номер ответа: 3
Автор ответа:
 Skywalker



ICQ: 300-70-6пятьЪ 

Вопросов: 62
Ответов: 545
 Web-сайт: iSkywalker.ru
 Профиль | | #3
Добавлено: 29.06.10 08:44
если уж совсем честно, то это не WPF Way, в WPF задумано делать биндинги данных, и тогда твоя проблема сведется к items[3].vtoroystolbec = 5;

Ответить

Номер ответа: 4
Автор ответа:
 s12



Вопросов: 24
Ответов: 363
 Профиль | | #4 Добавлено: 29.06.10 09:07
Привязка данных это конечно хорошо, но вот... По моему перемудрили в микрософте.
Можно пример?

Ответить

Номер ответа: 5
Автор ответа:
 Skywalker



ICQ: 300-70-6пятьЪ 

Вопросов: 62
Ответов: 545
 Web-сайт: iSkywalker.ru
 Профиль | | #5
Добавлено: 29.06.10 14:51
XAML:
  1. <Window x:Class="WpfTest.Window1"
  2.     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3.     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4.     Title="Window1" Height="300" Width="300" Loaded="Window_Loaded">
  5.     <StackPanel>
  6.         <ListView Name="listView">
  7.             <ListView.View>
  8.                 <GridView>
  9.                     <GridViewColumn Header="Название" DisplayMemberBinding="{Binding Name}"/>
  10.                     <GridViewColumn Header="Кол-во" DisplayMemberBinding="{Binding Count}"/>
  11.                     <GridViewColumn Header="Цена" DisplayMemberBinding="{Binding Price}"/>
  12.                 </GridView>
  13.             </ListView.View>
  14.         </ListView>
  15.         <Button Name="btnEdit" Click="btnEdit_Click">Редактировать</Button>
  16.     </StackPanel>
  17. </Window>


Product.cs :
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6. namespace WpfTest
  7. {
  8.     class Product
  9.     {
  10.         public string Name { get; set; }
  11.         public int Count { get; set; }
  12.         public decimal Price { get; set; }
  13.     }
  14. }


Window1.xaml.cs :
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Windows;
  6. using System.Windows.Controls;
  7. using System.Windows.Data;
  8. using System.Windows.Documents;
  9. using System.Windows.Input;
  10. using System.Windows.Media;
  11. using System.Windows.Media.Imaging;
  12. using System.Windows.Navigation;
  13. using System.Windows.Shapes;
  14. using System.Collections.ObjectModel;
  15. using System.ComponentModel;
  16.  
  17. namespace WpfTest
  18. {
  19.     public partial class Window1 : Window
  20.     {
  21.         private ObservableCollection<Product> products = new ObservableCollection<Product>();
  22.  
  23.         public Window1()
  24.         {
  25.             InitializeComponent();
  26.         }
  27.  
  28.         private void btnEdit_Click(object sender, RoutedEventArgs e)
  29.         {
  30.             products.Where(product => product.Name.Equals("Утюг")).First().Count = 100500;
  31.             ICollectionView view = CollectionViewSource.GetDefaultView(listView.ItemsSource);
  32.             view.Refresh();
  33.         }
  34.  
  35.         private void Window_Loaded(object sender, RoutedEventArgs e)
  36.         {
  37.             products.Add(new Product() { Name = "Утюг", Count = 1, Price = 123.77m });
  38.             listView.ItemsSource = products;
  39.         }
  40.     }
  41. }

Ответить

Номер ответа: 6
Автор ответа:
 Skywalker



ICQ: 300-70-6пятьЪ 

Вопросов: 62
Ответов: 545
 Web-сайт: iSkywalker.ru
 Профиль | | #6
Добавлено: 29.06.10 14:52
причем, если добавляешь новый элемент в products или удаляешь, то рефрешить ничо не нада, оно само поймет

Ответить

Номер ответа: 7
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #7 Добавлено: 29.06.10 19:49
А там разве патерн Dependency Property не нужно реализовывать? Как иначе среда узнает что свойство изменилось и нужно обновить значение контрола?

Ответить

Номер ответа: 8
Автор ответа:
 s12



Вопросов: 24
Ответов: 363
 Профиль | | #8 Добавлено: 29.06.10 20:39
o_O Нифига себе!!! В WinForms нужно было две строчки я и искал нечто подобное.
Микрософт превзошел сам себя.

Спасибо огромное.

Ответить

Номер ответа: 9
Автор ответа:
 Skywalker



ICQ: 300-70-6пятьЪ 

Вопросов: 62
Ответов: 545
 Web-сайт: iSkywalker.ru
 Профиль | | #9
Добавлено: 29.06.10 21:13
я тут нашел СОВСЕМ УЖ ПРАВИЛЬНЫЙ вариант, он выглядит вот так:
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.ComponentModel;
  6.  
  7. namespace WpfTest
  8. {
  9.     class Product : INotifyPropertyChanged
  10.     {
  11.         private string name;
  12.         private int count;
  13.         private decimal price;
  14.  
  15.         public string Name {
  16.             get { return name; }
  17.             set
  18.             {
  19.                 Set(this, "Name", ref name, value, PropertyChanged);
  20.             }
  21.         }
  22.  
  23.         public int Count {
  24.             get { return count; }
  25.             set
  26.             {
  27.                 Set(this, "Count", ref count, value, PropertyChanged);
  28.             }
  29.         }
  30.  
  31.         public decimal Price
  32.         {
  33.             get { return price; }
  34.             set
  35.             {
  36.                 Set(this, "Price", ref price, value, PropertyChanged);
  37.             }
  38.         }
  39.  
  40.         public static void Set<T>(object owner, string propName, ref T oldValue, T newValue, PropertyChangedEventHandler eventHandler)
  41.         {
  42.             if (owner.GetType().GetProperty(propName) == null)
  43.             {
  44.                 throw new ArgumentException("No property named ‘" +
  45.                 propName + "‘ on " + owner.GetType().FullName);
  46.             }
  47.             if (!Equals(oldValue, newValue))
  48.             {
  49.                 oldValue = newValue;
  50.                 if (eventHandler != null)
  51.                 {
  52.                     eventHandler(owner, new PropertyChangedEventArgs(propName));
  53.                 }
  54.             }
  55.         }
  56.  
  57.         public event PropertyChangedEventHandler PropertyChanged;
  58.     }
  59. }




  1. private void btnEdit_Click(object sender, RoutedEventArgs e)
  2.         {
  3.             products.Where(product => product.Name.Equals("Утюг")).First().Count = 100500;
  4.         }

Ответить

Номер ответа: 10
Автор ответа:
 s12



Вопросов: 24
Ответов: 363
 Профиль | | #10 Добавлено: 29.06.10 23:07
Гыы... Типобезопасность рулит :) Нет, не в моем случае. Я предпочитаю явное ручное приведение типов перед выполнением подобных операции (Уже слышу крики и вижу летящие помидоры...).

Ответить

Номер ответа: 11
Автор ответа:
 Skywalker



ICQ: 300-70-6пятьЪ 

Вопросов: 62
Ответов: 545
 Web-сайт: iSkywalker.ru
 Профиль | | #11
Добавлено: 30.06.10 00:46
не, тут смысл в том, что класс реализует интерфейс INotifyPropertyChanged, с помощью которого сообщает listview, что изменилось свойство, и не нада вручную рефрешить его, при изменении свойства в элементе listview сам прорефрешица

Ответить

Номер ответа: 12
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #12 Добавлено: 01.07.10 12:28
http://lutay.uneta.com.ua/post/2010/07/01/INotifyPropertyChanged-implementation.aspx

В твоем примере у метода Set нужно заменить модификатор public на private или protected

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам