Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / WPF : TreeView, TreeViewItem=CheckBox событие Checked / 18 сообщений из 18, страница 1 из 1
14.08.2009, 20:38
    #36145478
koJIo6ok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WPF : TreeView, TreeViewItem=CheckBox событие Checked
есть у меня програмка на vb.net WinForms,
там форма с TreeView - TreeView.CheckBoxes = True под ним DataGridView, после события TreeView.AfterCheck DataGridView заполняется соответствующими "чекнутому" TreeNode данными, для того чтобы всегда был ток один TreeNode.Checked = True
есть -
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Private Sub TreeView_vip_AfterCheck(ByVal sender As System.Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles TreeView_vip.AfterCheck
        RemoveHandler TreeView_vip.AfterCheck, AddressOf Me.TreeView_vip_AfterCheck
        Dim nodex As TreeNode, node_st As Boolean
        node_st = e.Node.Checked
        For Each nodex In Me.TreeView_vip.Nodes
            nodex.Checked = False
            If nodex.Nodes.Count > 0 Then Call CheckedNodeChild(nodex)
        Next
        e.Node.Checked = node_st
        AddHandler TreeView_vip.AfterCheck, AddressOf Me.TreeView_vip_AfterCheck
End Sub

Public Sub CheckedNodeChild(ByVal nodex As TreeNode)
        For Each nodex In nodex.Nodes
            nodex.Checked = False
            If nodex.Nodes.Count > 0 Then Call CheckedNodeChild(nodex)
        Next
End Sub

тоже самое делаю в WPF
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
public class myTreeViewItem : TreeViewItem
    {
        public CheckBox checkBox = new CheckBox();
        public TextBlock textBlock = new TextBlock();
                
        public myTreeViewItem()
        {       
            DockPanel dp = new DockPanel();
            dp.Children.Add(checkBox);
            dp.Children.Add(textBlock);
            Header = dp;         
        }        
    }
заполняю TreeView (ток часть кода)
Код: plaintext
1.
2.
3.
4.
item_ob = new myTreeViewItem();                                          
item_ob.textBlock.Text = rdr.GetString(1);
item_ob.myPropGrouping = myEnumGroupping.ob.GetHashCode();
my_TreeView.Items.Add(item_ob);
тоже нужно получить только один item_ob.checkBox = true
как тут можно реализовать это? переделать верхний вариант не получается(там надо было удалить 1 Handler пройтись по всем нодам и вернуть назад то тут если добавлять
Код: plaintext
1.
item_ob.checkBox.Checked += new RoutedEventHandler(checkBox_OnChecked);
стремно как-то - дерево может быть большое(до 1000 всех нодов - ну да, для меня большое), или это норм?
или сделать по другому - помнить чекнутый CheckBox при еще одном CheckBox.IsChecked = true с первым - CheckBox.IsChecked = false;
я так пробывал, но видно что-то пропустил - иногда было норм а иногда появлялись несколько отмеченных чекбоксов
подскажите как быть плз, или другой какой вариант

зы вот чувствую что надо использовать что-то отсюда - "Глава 7. Делегаты и события"
читаю, но видно не понимаю - тк что-то придумать и применить не могу
...
Рейтинг: 0 / 0
14.08.2009, 23:53
    #36145603
v skopin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WPF : TreeView, TreeViewItem=CheckBox событие Checked
Можно тупой вопрос?
имеем:
Код: plaintext
1.
2.
3.
4.
class A
{
     int I;
     ...
}
Как создать событие, скажем, ОnChangedI? (именно событие, а не там сет / гет)
...
Рейтинг: 0 / 0
15.08.2009, 23:01
    #36146066
Roman S. Golubin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WPF : TreeView, TreeViewItem=CheckBox событие Checked
koJIo6ok,

1. Срочно читаем тынц что бы не было мучительно больно за потраченное на писанину время.
2. Подписаться на событие Checked каждого элемента дерева - нормальная практика. Так как при правильном подходе 90% дерева виртуализировано и на виртуальные компоненты подписываться нет необходимости.
...
Рейтинг: 0 / 0
15.08.2009, 23:13
    #36146068
Roman S. Golubin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WPF : TreeView, TreeViewItem=CheckBox событие Checked
v skopin(именно событие, а не там сет / гет)
И кто, по вашему, должен будет оповещать подписантов об изменении значения I - каждый, кто это значение меняет? Не проще один раз get/set написать?
...
Рейтинг: 0 / 0
16.08.2009, 15:18
    #36146375
v skopin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WPF : TreeView, TreeViewItem=CheckBox событие Checked
Roman S. GolubinНе проще один раз get/set написать?Где-то с год назад возникла у меня такая проблема, сейчас не могу вспомнить точно, я тогда реализовал через гет/сет, НО хоть режь, не помню, почему хотел я тогда именно событие!
...
Рейтинг: 0 / 0
16.08.2009, 15:20
    #36146377
v skopin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WPF : TreeView, TreeViewItem=CheckBox событие Checked
Там было наследование, и нужно было +=
...
Рейтинг: 0 / 0
16.08.2009, 17:24
    #36146451
Roman S. Golubin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WPF : TreeView, TreeViewItem=CheckBox событие Checked
v skopinТам было наследование, и нужно было +=
Ничего не понял
...
Рейтинг: 0 / 0
16.08.2009, 18:39
    #36146484
SeVa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WPF : TreeView, TreeViewItem=CheckBox событие Checked
Никакие подписки на события не нужны.
codeproject
...
Рейтинг: 0 / 0
16.08.2009, 20:13
    #36146549
Roman S. Golubin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WPF : TreeView, TreeViewItem=CheckBox событие Checked
SeVaНикакие подписки на события не нужны.
codeproject

Хранение ссылки на предка и вызов конкретного метода предка - это что, если не подписка? Чем этот метод отличается от подписки предка на событие, кроме того, что в первом случае получаем СИЛЬНУЮ связь?
...
Рейтинг: 0 / 0
16.08.2009, 22:58
    #36146682
SeVa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WPF : TreeView, TreeViewItem=CheckBox событие Checked
1. РОман,если ты даешь первую ссылку на MVVM,то тогда уже будь последователен до конца.В нем вся обработка должна вестись в ViewModel, a во View - ни строчки.В этом большая и принципиальная разница с твоим подходом,нет спагетти кода
2.Надцать вариантов,когда можно обойтись и без Parent
...
Рейтинг: 0 / 0
17.08.2009, 10:18
    #36147020
Roman S. Golubin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WPF : TreeView, TreeViewItem=CheckBox событие Checked
SeVa1. РОман,если ты даешь первую ссылку на MVVM,то тогда уже будь последователен до конца.В нем вся обработка должна вестись в ViewModel, a во View - ни строчки.В этом большая и принципиальная разница с твоим подходом,нет спагетти кода
2.Надцать вариантов,когда можно обойтись и без Parent

1. Ткни пальцем, где я предлагал что-то писать во View :)
2. Надцать вариантов, где можно вообще обойтись без checked-дерева
...
Рейтинг: 0 / 0
17.08.2009, 10:43
    #36147099
koJIo6ok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WPF : TreeView, TreeViewItem=CheckBox событие Checked
так добавляю обработчик события
Код: plaintext
1.
item_ob.checkBox.Checked += new RoutedEventHandler(checkBox_OnChecked);
а как его удалить? подскажите плз
...
Рейтинг: 0 / 0
17.08.2009, 10:45
    #36147108
Roman S. Golubin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WPF : TreeView, TreeViewItem=CheckBox событие Checked
... -= new RoutedEventHandler(checkBox_OnChecked);
...
Рейтинг: 0 / 0
17.08.2009, 11:01
    #36147158
koJIo6ok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WPF : TreeView, TreeViewItem=CheckBox событие Checked
Roman S. Golubin,

спасибо, а почему
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
void checkBox_OnChecked(object sender, RoutedEventArgs e)
        {
            CheckBox currentCheckBox = (CheckBox)sender;
            
            foreach (myTreeViewItem item in my_TreeView.Items)
            {

                item.checkBox.Checked -= new RoutedEventHandler(checkBox_OnChecked);
                item.checkBox.IsChecked = false;
                item.checkBox.Checked += new RoutedEventHandler(checkBox_OnChecked);
            }
            currentCheckBox.IsChecked = true;
        }

Код: plaintext
1.
2.
System.StackOverflowException was unhandled

...
Рейтинг: 0 / 0
17.08.2009, 11:51
    #36147275
koJIo6ok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WPF : TreeView, TreeViewItem=CheckBox событие Checked
поправил
Код: plaintext
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.
31.
32.
33.
34.
35.
36.
37.
38.
void checkBox_OnChecked(object sender, RoutedEventArgs e)
        {
            CheckBox currentCheckBox = (CheckBox)sender;
            
            foreach (myTreeViewItem item in my_TreeView.Items)
            {                
                item.checkBox.Checked -= new RoutedEventHandler(checkBox_OnChecked);
                if (item.checkBox.IsChecked == true)
                {
                    item.checkBox.IsChecked = false;
                }
                item.checkBox.Checked += new RoutedEventHandler(checkBox_OnChecked);
                if (item.Items.Count > 0)
                {
                    checkBoxUnchecked(item);
                }
            }
            currentCheckBox.Checked -= new RoutedEventHandler(checkBox_OnChecked);
            currentCheckBox.IsChecked = true;
            currentCheckBox.Checked += new RoutedEventHandler(checkBox_OnChecked);
        }
       
        private void checkBoxUnchecked(myTreeViewItem itemRoot)
        {
            foreach (myTreeViewItem item in itemRoot.Items)
            {
                item.checkBox.Checked -= new RoutedEventHandler(checkBox_OnChecked);
                if (item.checkBox.IsChecked == true)
                {
                    item.checkBox.IsChecked = false;
                }
                item.checkBox.Checked += new RoutedEventHandler(checkBox_OnChecked);
                if (item.Items.Count > 0)
                {
                    checkBoxUnchecked(item);
                }
            }
        }
...
Рейтинг: 0 / 0
17.08.2009, 12:31
    #36147361
SeVa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WPF : TreeView, TreeViewItem=CheckBox событие Checked
koJIo6ok, WPF это не WinForms, в нем совершенно другие подходы
Код: plaintext
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.
public ItemViewModel : INotifyPropertyChanged
{
   public ObservableCollection<ItemViewModel> Childs{ get; set; }
   public string Name { get; }
   public bool? IsChecked? { 
                         get { return _isChecked;
                         set { 
                                SetIsChecked(value);
                         } 
   public ItemViewModel Parent { get; set; }

   private void SetIsChecked(bool? value)
   {
        if( value == this._isChecked) return;
        if( true == value )
        {
           ItemViewModel prevChecked = GetPrevCheckedItem(this);
           if ( null != prevChecked && prevChecked.IsChecked)
               prevChecked.IsChecked = false;
        }
        this._isChecked = value;
        this.OnPropertyChanged("IsChecked");
   }
    
}
...
Рейтинг: 0 / 0
17.08.2009, 13:03
    #36147455
Roman S. Golubin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WPF : TreeView, TreeViewItem=CheckBox событие Checked
SeVakoJIo6ok, WPF это не WinForms, в нем совершенно другие подходы
Он ссылок не умеет читать или времени нету - занят написанием новой программы
...
Рейтинг: 0 / 0
17.08.2009, 17:50
    #36148446
koJIo6ok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WPF : TreeView, TreeViewItem=CheckBox событие Checked
Roman S. GolubinSeVakoJIo6ok, WPF это не WinForms, в нем совершенно другие подходы
Он ссылок не умеет читать или времени нету - занят написанием новой программы

да нет все гораздо проще, по вашей ссылке сразу читнул + в нете глянул + SeVа-ы кусок но никак не могу понять как это работает и как прикрутить себе
да и потом в этом что плохого?
Код: plaintext
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.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
void checkBox_OnChecked(object sender, RoutedEventArgs e)
        {
            CheckBox currentCheckBox = (CheckBox)sender;           

            foreach (Control cntrl in my_TreeView.Items)
            {
                if (cntrl.GetType() == typeof(myTreeViewItem))
                {
                    myTreeViewItem item = (myTreeViewItem)cntrl;
                    item.checkBox.Checked -= new RoutedEventHandler(checkBox_OnChecked);
                    if (item.checkBox.IsChecked == true)
                    {
                        item.checkBox.IsChecked = false;
                    }
                    item.checkBox.Checked += new RoutedEventHandler(checkBox_OnChecked);
                    if (item.Items.Count > 0)
                    {
                        checkBoxUnchecked(item.Items);
                    }
                }
                else if (cntrl.GetType() == typeof(TreeViewItem) & ((TreeViewItem)cntrl).Items.Count > 0)
                {
                    checkBoxUnchecked(((TreeViewItem)cntrl).Items);
                }
            }
            currentCheckBox.Checked -= new RoutedEventHandler(checkBox_OnChecked);
            currentCheckBox.IsChecked = true;
            currentCheckBox.Checked += new RoutedEventHandler(checkBox_OnChecked);
        }     
        
        private void checkBoxUnchecked(ItemCollection itemCollection)
        {
            foreach (myTreeViewItem item in itemCollection)
            {
                item.checkBox.Checked -= new RoutedEventHandler(checkBox_OnChecked);                
                if (item.checkBox.IsChecked == true)
                {
                    item.checkBox.IsChecked = false;
                }
                item.checkBox.Checked += new RoutedEventHandler(checkBox_OnChecked);
                if (item.Items.Count > 0)
                {
                    checkBoxUnchecked(item.Items);
                }
            }
        }
или осилив INotifyPropertyChanged будет легче писать или новые возможности?
...
Рейтинг: 0 / 0
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / WPF : TreeView, TreeViewItem=CheckBox событие Checked / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]