Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.216.121.55] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
<Window x:Class="WpfApplication4.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"> <Grid> <TreeView Height="311" HorizontalAlignment="Left" Name="treeView1" VerticalAlignment="Top" Width="503" > <TreeViewItem Header='1111' ItemsSource="{Binding list_n}"> <TreeViewItem.ItemTemplate> <DataTemplate> <StackPanel Orientation="Horizontal"> <TextBlock Text="{Binding name}"/> </StackPanel> </DataTemplate> </TreeViewItem.ItemTemplate> </TreeViewItem> </TreeView> </Grid> </Window> namespace WpfApplication4 { /// <summary> /// Логика взаимодействия для MainWindow.xaml /// </summary> public partial class MainWindow : Window { public List<Item_N> list_n; public MainWindow() { InitializeComponent(); InitializeComponent(); list_n = new List<Item_N>(); list_n.Add(new Item_N { id = 1, name = "1" }); list_n.Add(new Item_N { id = 2, name = "2" }); list_n.Add(new Item_N { id = 3, name = "3" }); list_n.Add(new Item_N { id = 4, name = "4" }); list_n.Add(new Item_N { id = 5, name = "5" }); list_n.Add(new Item_N { id = 6, name = "6" }); DataContext = new { list_n }; } } public class Item_N { public int id { get; set; } public string name { get; set; } } } такой значит, код есть. Как можно при щелчке на элементе трея обновить привязанное поле name , и сделать его 0, и как сделать чтобы если name равно "0" - сделать айтем, например зелёным ? Прикреплённый файлWpfApplication4.7z (22,64 Кбайт, скачиваний: 157) |
Сообщ.
#2
,
|
|
|
никто не знает?
можно упростить. Есть трей, с заданным айтем сорсом. как при щелчке на текущий айтем сделать что-нибудь с привязанным объектом? |
Сообщ.
#3
,
|
|
|
Задать для treeViewItem MouseLeftButtonUp и в нём изменить свойство у текущего выбранного элемента.
<TreeViewItem Name="MyGroup" Header='1111' ItemsSource="{Binding list_n}" MouseLeftButtonUp="MyGroup_MouseLeftButtonUp"> В коде обработчика: private void MyGroup_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) { Item_N MySelectedItem = null; Type CheckType = treeView1.SelectedItem.GetType(); if (CheckType.Name == "Item_N") { MySelectedItem = (Item_N)treeView1.SelectedItem; MySelectedItem.Name="Я элемент"; } } В самом классе вроде нужно добавить уведомления для изменения свойств для нашего treeView, иначе он не 'поймёт' что мы меняем свойства элемента. public class Item_N: INotifyPropertyChanged { public int id { get; set; } private string _name; public string name { get { return this._name; } set { try { _name = value; if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs("name")); } } catch (Exception Exception) { } } } public event PropertyChangedEventHandler PropertyChanged; //вот оно } Добавлено А для того чтобы сделать зелёным, можно создать биндинг на свойство background у TextBlock т.е. <TextBlock Text="{Binding name}" Background="{Binding BackColor}"/> в классе: public class Item_N: INotifyPropertyChanged { public int id { get; set; } private Brush _backcolor; public Brush BackColor { get { return _backcolor; } set { _backcolor = value; if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs("BackColor")); } } } private string _name; public string name { get { return this._name; } set { try { _name = value; if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs("name")); } } catch (Exception Exception) { } } } public event PropertyChangedEventHandler PropertyChanged; //вот оно } задаём: if(MySelectedItem.Name == "0") { MySelectedItem.BackColor = (Brush)new BrushConverter().ConvertFromString("Green"); } |
Сообщ.
#4
,
|
|
|
а вот тут:
public List<Item_N> list_n; он поменяется? Добавлено (Item_N)treeView1.SelectedItem; я смотрел. только возвращает, и всё. |
Сообщ.
#5
,
|
|
|
Цитата (Item_N)treeView1.SelectedItem; я смотрел. только возвращает, и всё. Возвращает что? public List<Item_N> list_n; |
Сообщ.
#6
,
|
|
|
блин.. я неправильно думал..
Мне казалось, что public List<Item_N> list_n; должен будет так же изменяться. клацну я там, например на трее в менюшке, "добавить объект", в обработчике кликания будет что-то вроде: list_n.Add(new Item_N { id = 7, name = "7" }); и он появиться и в трейчике. |
Сообщ.
#7
,
|
|
|
Так надо новый добавить а не обновить существующий?
|
Сообщ.
#8
,
|
|
|
Koss Еслы вы хотите чтобы данные обновлялись автоматически используйте ObservableCollection а не List. Если вы добавите в List новый айтем то данные вы не увидете обновленные. Нужно писать как вам писал 100500 об INotifyPropertyChanged и сделать проперти для List<Item_N> list_n. Тогда данные будут обновлены. Попробуйте использовать MVVM паттерн. И отделите код от логики. Так будет проще сопровождать проэкт. Модель вам уже написали.
ViewModel написать не сложно. Вот мое виденье как можно переписать логику. public class NotifyPropertyChangedBase : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; public void RaisePropertyChanged(string propertyName) { var propertyChanged = PropertyChanged; if (propertyChanged != null) propertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } public class Item_N : NotifyPropertyChangedBase { public int id { get; set; } private Brush _backcolor; public Brush BackColor { get { return _backcolor; } set { _backcolor = value; RaisePropertyChanged("BackColor"); } } private string _name; public string Name { get { return this._name; } set { try { _name = value; RaisePropertyChanged("Name"); } catch (Exception Exception) { } } } } public class Item_NViewModel : NotifyPropertyChangedBase { private ObservableCollection<Item_N> _itemsNCollection = new ObservableCollection<Item_N>(); public ObservableCollection<Item_N> ItemsNCollection { get { return _itemsNCollection; } set { _itemsNCollection = value; RaisePropertyChanged("ItemsNCollection"); } } #region Command #endregion } |
Сообщ.
#9
,
|
|
|
Цитата 100500 @ Так надо новый добавить а не обновить существующий? insert, update и Delete. На этом примере я с ВПФ разбираюсь. |
Сообщ.
#10
,
|
|
|
начал разбираться в этом MVVM
переделал под этот паттерн. Почему не зеленеет? Прикреплённый файлWpfApplication4.7z (30,2 Кбайт, скачиваний: 134) Добавлено да.. и почему у меня в текстбоксе можно только первый элемент редактировать? |
Сообщ.
#11
,
|
|
|
public string name { get { return item.name; } set { item.name = value; if (value == "0") BackColor = Brushes.Green; OnPropertyChanged("name"); } } private Brush _backcolor; public Brush BackColor { get { return _backcolor; } set { _backcolor = value; OnPropertyChanged("BackColor"); } } а почему не работает типа такого: public Brush BackColor { get { return (name=="0" ? Brushes.Green : Brushes.White); } } Добавлено да и ещё вопрос есть.. каким боком тут INotifyPropertyChanged взаимодействует? я ни к каким событиям не подписывался. Почему , когда убрать наследование от INotifyPropertyChanged ничего не апдейтится? |
Сообщ.
#12
,
|
|
|
Цитата Koss @ да и ещё вопрос есть.. каким боком тут INotifyPropertyChanged взаимодействует? я ни к каким событиям не подписывался. Почему , когда убрать наследование от INotifyPropertyChanged ничего не апдейтится? Вот таким Цитата MSDN .Для появления уведомления об изменении привязки клиента и источника данных связанный тип должен: Либо реализовать интерфейс INotifyPropertyChanged (предпочтительный вариант). Либо обеспечить событие изменения для каждого свойства связанного типа. Просто для обновления свойста используеться updatesourcetrigger. А почему именно так это работает прочтите об Binding.UpdateSourceTrigger и INotifyPropertyChanged по ссылкам которые вам приводили. |
Сообщ.
#13
,
|
|
|
а почему у меня в геттер не заходит? в отладчике даже ловушку ставил.
|
Сообщ.
#14
,
|
|
|
Цитата Koss @ а почему у меня в геттер не заходит? в отладчике даже ловушку ставил. Потому что обновленные данные получаются через метаданные GetMetadata. Более подробно про то как это работает можно почитать здесь. Либо источник2 на который все ссылаются. |
Сообщ.
#15
,
|
|
|
в смысле вот таким макаром перереализовавать интерфейс:
public void NotifyPropertyChanged<T>(Expression<Func<T>> property) { if (PropertyChanged != null) { var memberExpression = property.Body as MemberExpression; PropertyChanged(this, new PropertyChangedEventArgs(memberExpression.Member.Name)); } } ? чтоб туда делегат можно было сувать? |