powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / WPF : TreeView, TreeViewItem=CheckBox событие Checked
18 сообщений из 18, страница 1 из 1
WPF : TreeView, TreeViewItem=CheckBox событие Checked
    #36145478
koJIo6ok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть у меня програмка на 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
WPF : TreeView, TreeViewItem=CheckBox событие Checked
    #36145603
v skopin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно тупой вопрос?
имеем:
Код: plaintext
1.
2.
3.
4.
class A
{
     int I;
     ...
}
Как создать событие, скажем, ОnChangedI? (именно событие, а не там сет / гет)
...
Рейтинг: 0 / 0
WPF : TreeView, TreeViewItem=CheckBox событие Checked
    #36146066
Фотография Roman S. Golubin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
koJIo6ok,

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

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

1. Ткни пальцем, где я предлагал что-то писать во View :)
2. Надцать вариантов, где можно вообще обойтись без checked-дерева
...
Рейтинг: 0 / 0
WPF : TreeView, TreeViewItem=CheckBox событие Checked
    #36147099
koJIo6ok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так добавляю обработчик события
Код: plaintext
1.
item_ob.checkBox.Checked += new RoutedEventHandler(checkBox_OnChecked);
а как его удалить? подскажите плз
...
Рейтинг: 0 / 0
WPF : TreeView, TreeViewItem=CheckBox событие Checked
    #36147108
Фотография Roman S. Golubin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
... -= new RoutedEventHandler(checkBox_OnChecked);
...
Рейтинг: 0 / 0
WPF : TreeView, TreeViewItem=CheckBox событие Checked
    #36147158
koJIo6ok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
WPF : TreeView, TreeViewItem=CheckBox событие Checked
    #36147275
koJIo6ok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
поправил
Код: 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
WPF : TreeView, TreeViewItem=CheckBox событие Checked
    #36147361
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
WPF : TreeView, TreeViewItem=CheckBox событие Checked
    #36147455
Фотография Roman S. Golubin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVakoJIo6ok, WPF это не WinForms, в нем совершенно другие подходы
Он ссылок не умеет читать или времени нету - занят написанием новой программы
...
Рейтинг: 0 / 0
WPF : TreeView, TreeViewItem=CheckBox событие Checked
    #36148446
koJIo6ok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
18 сообщений из 18, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / WPF : TreeView, TreeViewItem=CheckBox событие Checked
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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