powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Иерархическое отображение данных xml-файла в элементе TreeView с помощью привязки
25 сообщений из 168, страница 4 из 7
Иерархическое отображение данных xml-файла в элементе TreeView с помощью привязки
    #36636434
Фотография Шайтан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУАндрей, накидал Вам простой пример MVVM (на моих любимых DelegateCommand). Смотрите. Будут вопросы - задавайте.

ты из Владивостока?

http://megadarja.blogspot.com/2010/04/mvvm-wpf.html
...
Рейтинг: 0 / 0
Иерархическое отображение данных xml-файла в элементе TreeView с помощью привязки
    #36636497
Silverlight
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
искра, брось свои еврейские мультики и досужие домыслы. это ты покупаешь левые серверы, я своей головой обхожусь, на древнем барохле не сижу, вместо просмотров фильмов, как ты, смотрю совсем другое.
Приходи в гости, я тебе покажу кусочек программирования
...
Рейтинг: 0 / 0
Иерархическое отображение данных xml-файла в элементе TreeView с помощью привязки
    #36636516
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ... на моих любимых DelegateCommand ...DelegateCommand - маразм. Вот самая нормальная реализация ICommand.
(c) мой
Код: 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.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
    public class ViewModelAction : NotifyObject, ICommand
    {
        #region Construct

        public ViewModelAction()
        { }

        public ViewModelAction(Action handler)
        {
            Handler += handler;
        }

        #endregion

        #region Core

        public event Action Handler;
        protected virtual void OnHandler()
        {
            if (Handler != null)
                Handler();
        }

        bool _enabled = true;
        public bool Enabled
        {
            get { return _enabled; }
            set
            {
                if (_enabled == value)
                    return;

                _enabled = value;
                OnPropertyChanged(F_Enabled);
                _canExecuteChanged(this, EventArgs.Empty);
            }
        }
        public const string F_Enabled = "Enabled";

        public void Execute()
        {
            if (Enabled)
                OnHandler();
        }

        #endregion

        #region ICommand Members

        bool ICommand.CanExecute(object parameter)
        {
            return Enabled;
        }

        EventHandler _canExecuteChanged = delegate { };
        event EventHandler ICommand.CanExecuteChanged
        {
            add { _canExecuteChanged += value; }
            remove { _canExecuteChanged -= value; }
        }

        void ICommand.Execute(object parameter)
        {
            Execute();
        }

        #endregion
    }
ЗЫ: Ключевой момент - свойство Enabled.
...
Рейтинг: 0 / 0
Иерархическое отображение данных xml-файла в элементе TreeView с помощью привязки
    #36636544
Фотография iscrafm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Модератор: Воздерживаемся от оскорблений. 1 предупреждение.
Касается обоих.
...
Рейтинг: 0 / 0
Иерархическое отображение данных xml-файла в элементе TreeView с помощью привязки
    #36636577
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ШайтанМСУАндрей, накидал Вам простой пример MVVM (на моих любимых DelegateCommand). Смотрите. Будут вопросы - задавайте.

ты из Владивостока?

http://megadarja.blogspot.com/2010/04/mvvm-wpf.html

Сравни её пример и мой. Задумайся над своим вопросом.
P.S. За основу взял этот пример, чтоб с нуля Композитуму не писать.

Алексей КDelegateCommand - маразм. Вот самая нормальная реализация ICommand
DelegateCommand - не маразм. Обычный враппинг, и только.
Вот самая нормальная реализация ICommand: AttachedCommandBehavior или Microsoft.Expression.Interactivity. Лёша, не придумывайте лисапедов.
...
Рейтинг: 0 / 0
Иерархическое отображение данных xml-файла в элементе TreeView с помощью привязки
    #36636597
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КDelegateCommand - маразм
Смотрите, сколько букаф у меня получается :)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
<!-- Пример событий -->
<Image Source="http://www.sql.ru/forum/members/92081.gif">
    <acb:CommandBehaviorCollection.Behaviors>
        <!-- Пример с Action -->
        <acb:BehaviorBinding Event="MouseLeftButtonDown" Action="{Binding DoActionLeftCommand}" CommandParameter="Нажата левая педаль мышки"/>
        <!-- Пример с Command -->
        <acb:BehaviorBinding Event="MouseRightButtonDown" Command="{Binding RightSimpleCommand}" CommandParameter="Нажата правая педаль мышки"/>
    </acb:CommandBehaviorCollection.Behaviors>
</Image>

<!-- Пример команд -->
<Button Content="Clear" Command="{Binding ClearCommand}"/>

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
class MainViewModel : ViewModelBase
{
    public MainViewModel()
    {      
        DoActionLeftCommand = x => MessageBox.Show("Обработчик на Action:" + x.ToString());

        RightSimpleCommand = new SimpleCommand
        {
            ExecuteDelegate = x => MessageBox.Show("Обработчик на Command:" + x.ToString()),
            CanExecuteDelegate = x => true
        };

        ClearCommand = new SimpleCommand
        {
            ExecuteDelegate = x => MessageBox.Show("Нажата кнопка!"),
            CanExecuteDelegate = x => true
        };        
    }    

    public Action<object> DoActionLeftCommand { get; private set; }
    public ICommand RightSimpleCommand { get; private set; }
    public ICommand ClearCommand { get; private set; }
}

P.S. Согласный "свой" вариант засунуть в печку?
P.S2. Не пишите лисапедов, уже всё написано. DelegateCommand - самое простое для понимания, о котором (понимании) меня просил Андрейка Композитный.
...
Рейтинг: 0 / 0
Иерархическое отображение данных xml-файла в элементе TreeView с помощью привязки
    #36636619
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУАндрейка Композитный.
МСУ, может как-то будем фильтровать звуки?
...
Рейтинг: 0 / 0
Иерархическое отображение данных xml-файла в элементе TreeView с помощью привязки
    #36636626
Фотография Мусичка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CompositumМСУАндрейка Композитный.
МСУ, может как-то будем фильтровать звуки?
Ну это же лучше, чем просто Композ.
...
Рейтинг: 0 / 0
Иерархическое отображение данных xml-файла в элементе TreeView с помощью привязки
    #36636744
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ
Код: plaintext
1.
2.
3.
4.
        RightSimpleCommand = new SimpleCommand
        {
            ExecuteDelegate = x => MessageBox.Show("Обработчик на Command:" + x.ToString()),
            CanExecuteDelegate = x => true
        };
Я же говорю, ключевой момент - свойство Enabled. С DelegateCommand проблемы начинаются, когда CanExecuteDelegate посложнее чем x => true .
...
Рейтинг: 0 / 0
Иерархическое отображение данных xml-файла в элементе TreeView с помощью привязки
    #36636838
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КЯ же говорю, ключевой момент - свойство Enabled. С DelegateCommand проблемы начинаются, когда CanExecuteDelegate посложнее чем x => true .
Да п о лно Вам. Можно пойди в обход и биндить UIElement.IsEnabled на своё условие в зависимости от логики, представленной в ViewModel. Enabled - это ведь не панацея. Роль CanExecute делегата состоит не в IsEnabled, а в факте "можно или нельзя" выполнить команду. А Enabled это уже гуевые рюшечки, чтоб уж "наверняка".
...
Рейтинг: 0 / 0
Иерархическое отображение данных xml-файла в элементе TreeView с помощью привязки
    #36636885
Silverlight
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей КМСУ
Код: plaintext
1.
2.
3.
4.
        RightSimpleCommand = new SimpleCommand
        {
            ExecuteDelegate = x => MessageBox.Show("Обработчик на Command:" + x.ToString()),
            CanExecuteDelegate = x => true
        };
Я же говорю, ключевой момент - свойство Enabled. С DelegateCommand проблемы начинаются, когда CanExecuteDelegate посложнее чем x => true .
У тебя будут другие проблемы - утечка памяти(это происходило в Prism). Должны быть WeakReferenceHandler
...
Рейтинг: 0 / 0
Иерархическое отображение данных xml-файла в элементе TreeView с помощью привязки
    #36636978
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУАлексей КЯ же говорю, ключевой момент - свойство Enabled. С DelegateCommand проблемы начинаются, когда CanExecuteDelegate посложнее чем x => true .
Да п о лно Вам. Можно пойди в обход и биндить UIElement.IsEnabled на своё условие в зависимости от логики, представленной в ViewModel.Зачем идти в обход и плодить свойства, если нормальное решение занимает пару десятков строк велосипедокода?

SilverlightУ тебя будут другие проблемы - утечка памяти(это происходило в Prism). Должны быть WeakReferenceHandlerЗаменить на WeakReferenceHandler несложно. Я видел это в Призме, но не понял зачем. Кажется там в коментариях было что-то про производительность.

Что за утечки памяти? Если забывать потом отписываться от событий там где нужно? Если нет, то можно показательный пример?
...
Рейтинг: 0 / 0
Иерархическое отображение данных xml-файла в элементе TreeView с помощью привязки
    #36637014
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КЗачем идти в обход и плодить свойства, если нормальное решение занимает пару десятков строк велосипедокода?
А зачем придумывать какую-то логику в модели, "посложнее чем x => true"? CanExecuteDelegate решит любую задачу, которая будет описана в ViewModel.
Если ViewModel не обладает этой информацией - Вы не правильно спроектировали ViewModel.
И тогда не будет никаких десятков строк велосипедокода.
x => true это, конечно же, для примера. Сюда можно вставить сколь угодно сложное условие. Главное, чтобы исходные данные были во ViewModel.
...
Рейтинг: 0 / 0
Иерархическое отображение данных xml-файла в элементе TreeView с помощью привязки
    #36637024
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУСюда можно вставить сколь угодно сложное условие. Главное, чтобы исходные данные были во ViewModel.Разумеется, все исходные данные во ViewModel есть. Причём, это одна из причин почему я отказался от CommandParameter.
...
Рейтинг: 0 / 0
Иерархическое отображение данных xml-файла в элементе TreeView с помощью привязки
    #36637038
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУCanExecuteDelegate решит любую задачу, которая будет описана в ViewModel.Только вот незадача, как определить момент вызова CanExecuteChanged, когда там куча входных параметров, перечень которых может постоянно меняться.
...
Рейтинг: 0 / 0
Иерархическое отображение данных xml-файла в элементе TreeView с помощью привязки
    #36637099
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КМСУCanExecuteDelegate решит любую задачу, которая будет описана в ViewModel.Только вот незадача, как определить момент вызова CanExecuteChanged, когда там куча входных параметров, перечень которых может постоянно меняться.
Всмысле? :) Когда первая строчка кода выполнится в CanExecuteChanged, тогда оно и момент вызова
Кучу параметров можно вынести в приват класс вьюмодели, и ориентироваться по ней (как вариант).
Лёнь, ну что Вы, в самом деле? )
...
Рейтинг: 0 / 0
Иерархическое отображение данных xml-файла в элементе TreeView с помощью привязки
    #36637391
Silverlight
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Алексей КМСУCanExecuteDelegate решит любую задачу, которая будет описана в ViewModel.Только вот незадача, как определить момент вызова CanExecuteChanged, когда там куча входных параметров, перечень которых может постоянно меняться.

В базовом классе создаем обработчики для основных операций CanSave, CanEdit,CanFetch,etc, которые зависят от текущего состояния Моdel и самого ViewModel.
Для других вариантов я сделал возможность задавать зависимости полей и делегатов(акции,функции). Те при измении поля или вызова делегата, будет автоматически вызываться сообщение об изменении других полей и/или вызываться нужные делегаты.
...
Рейтинг: 0 / 0
Иерархическое отображение данных xml-файла в элементе TreeView с помощью привязки
    #36637397
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сева, я ваще не понимаю, зачем делать акции на акции (или акции на команды)? Вьюмодель полноценна и сама может ответить на вопрос CanSave. Нахрена огороды городить?
...
Рейтинг: 0 / 0
Иерархическое отображение данных xml-файла в элементе TreeView с помощью привязки
    #36637407
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУВсмысле? :) Когда первая строчка кода выполнится в CanExecuteChanged, тогда оно и момент вызова Ситуаций может быть много, например:
Код: 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.
class MyViewModel
{     
     public MyViewModel()
     {
          C1 = new DelegateCommand(
              v => /*чё-то тут делаем*/,
              v => A1 > 0 && A2 > 0
          );
     }

     public ICommand C1 { get; private set; }

     int _a1;
     public int A1
     {
          get { return _a1; }
          set
          {
               _a1 = value;
               OnPropertyChanged("A1");
               C1.OnCanExecuteChanged(); // Накойхер (с) везьде расставлять эти команды? И ещё не забыть надо, если зависимости изменятся.
          }
     }

     int _a2;
     public int A2
     {
          get { return _a2; }
          set
          {
               _a2 = value;
               OnPropertyChanged("A2");
               C1.OnCanExecuteChanged(); // Накойхер (с) везьде расставлять эти команды? И ещё не забыть надо, если зависимости изменятся.
          }
     }
}

vs

Код: 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.
class MyViewModel
{     
     public MyViewModel()
     {
          C1 = new MyCommand(
              () => /*чё-то тут делаем*/
          );
     }

     public ICommand C1 { get; private set; }

     int _a1;
     public int A1
     {
          get { return _a1; }
          set
          {
               _a1 = value;
               OnPropertyChanged("A1");
          }
     }

     int _a2;
     public int A2
     {
          get { return _a2; }
          set
          {
               _a2 = value;
               OnPropertyChanged("A2");
          }
     }

     protected override void OnPropertyChanged(string propertyName)
     {
          base.OnPropertyChanged(propertyName);
          С1.Enabled = A1 > 0 && A2 > 0;
     }
}

ЗЫ: Как там называется OnCanExecuteChanged не помню...
...
Рейтинг: 0 / 0
Иерархическое отображение данных xml-файла в элементе TreeView с помощью привязки
    #36637434
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SilverlightВ базовом классе создаем обработчики для основных операций CanSave, CanEdit,CanFetch,etc, которые зависят от текущего состояния Моdel и самого ViewModel.
Для других вариантов я сделал возможность задавать зависимости полей и делегатов(акции,функции). Те при измении поля или вызова делегата, будет автоматически вызываться сообщение об изменении других полей и/или вызываться нужные делегаты.Я не стал заморачиваться. Сделал по старинке метод UpdateView, в котором пересчитываются все Enabled и т. п. И вызываю этот метод отовсюду, что может повлечь изменение состояния. Как правило достаточно это вызвать из CurrentItemChanged курсоров по коллекциям.

ЗЫ: Поясните про утечки памяти, интересно.
...
Рейтинг: 0 / 0
Иерархическое отображение данных xml-файла в элементе TreeView с помощью привязки
    #36637438
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЛёняC1.OnCanExecuteChanged(); // Накойхер (с) везьде расставлять эти команды? И ещё не забыть надо, если зависимости изменятся
Эээ, батенька, Вас никто не обязует реализовывать эту пыль. Если в задаче нужно перехватывать - значит реализовываем, если нет, то в топку. Ровным счетом, это относится и к INotifyPropertyChanged.
Посмотрите мой пример, который я дал. В MainViewModel.cs есть ObservableCollection<Book> BooksList. Вот как он описан:

Код: plaintext
public ObservableCollection<Book> BooksList { get; set; }

Где тут OnPropertyChanged? Нету. Почему? Потому, что нах не нужно. Тоже самое и Ваш OnCanExecuteChanged. Оно не обязательно. Так что зря Вы наезжаете на DelegateCommand. Кстати, смотрели RelayCommand? И как? Правильно, одна фигня, что и DelegateCommand :)
Так что не надо ля-ля :)
...
Рейтинг: 0 / 0
Иерархическое отображение данных xml-файла в элементе TreeView с помощью привязки
    #36637448
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУЕщё раз... View никак без Вашего участия не сможет определить, когда нужно вызвать CanExecute, чтобы обновить состояния контролов. Вы должны сами явно где-то вызвать CanExecuteChanged. А делать дополнительное свойство для биндинга на IsEnabled контролов глупо.
...
Рейтинг: 0 / 0
Иерархическое отображение данных xml-файла в элементе TreeView с помощью привязки
    #36637465
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КМСУЕщё раз... View никак без Вашего участия не сможет определить, когда нужно вызвать CanExecute
Это почему? :) Представьте, что пришел виндовой броадкаст мессадж. Во вьюмодели у меня находится перехватчик, который после перехвата осуществляет некий экзекут.
Каким боком тут View и "моё" участие, Лёня? )

Алексей КВы должны сами явно где-то вызвать CanExecuteChanged. А делать дополнительное свойство для биндинга на IsEnabled контролов глупо.
Я не понимаю до сих пор Вашей проблемы. Вы не можете определить точку входа в Ваш CanExecute?
...
Рейтинг: 0 / 0
Иерархическое отображение данных xml-файла в элементе TreeView с помощью привязки
    #36637511
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУПредставьте, что пришел виндовой броадкаст мессадж.Мы говорим о событиях, аля ButtonClick.
МСУВы не можете определить точку входа в Ваш CanExecute?Ещё раз. Напрягает инициировать событие ICommand.CanExecuteChanged во всех сеттерах свойств, событиях и т. п., которые могут повлиять на результат метода ICommand.CanExecute, который делегирует вызов подсунутому ему делегату. Это нужно чтобы View своевременно обновило состояние контролов согласно состоянию ICommand (возможности её вызова). Как правило это отражается на значении свойства IsEnabled.
...
Рейтинг: 0 / 0
Иерархическое отображение данных xml-файла в элементе TreeView с помощью привязки
    #36637516
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУГде тут OnPropertyChanged? Нету. Почему? Потому, что нах не нужно. Тоже самое и Ваш OnCanExecuteChanged. Оно не обязательно .В данной реализации это не так. Если его не будет - не будет обновляться состояние контролов во View.
...
Рейтинг: 0 / 0
25 сообщений из 168, страница 4 из 7
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Иерархическое отображение данных xml-файла в элементе TreeView с помощью привязки
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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