Модераторы: gambit, Kefir, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отловить нажатие кнопки в ListBox Item+DataBinding, Наладить двустороннюю связь события 
:(
    Опции темы
Vladimir_Petrov
Дата 2.2.2012, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 7.1.2007

Репутация: нет
Всего: нет



Изучаю WPF, пытаюсь привести свои некрасивые программы к современному виду. Подскажите пожалуйста направление, как победить ситуацию.
Есть ListBox, который связан с классом, содержащим коллекцию объектов. Помимо этого у ListBox Item есть кнопка, событие которого нужно отловить. Само событие отловить не сложно, но функция обработчик создается не в том классе, в котором хотелось бы (в классе окна). Важно знать, в каком объекте из коллекции произошло событие нажатия кнопки. То есть обработчик нажатия вставить в класс объекта.

Упрощенный вариант кода. Связывание делаю в Бленде.
Код

public class MyObjType : INotifyPropertyChanged
{
        private bool MyProperty
        {
                get;
                set;
        }
        public event PropertyChangedEventHandler PropertyChanged;
        private void NotifyPropertyChange(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
        //здесь хочется сделать функцию обработки события на нажатие кнопки в листбоксе
}

public class IAdapter : INotifyPropertyChanged
{
        public event PropertyChangedEventHandler PropertyChanged;
        private void NotifyPropertyChange(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
        public System.Collections.ObjectModel.ObservableCollection<MyObjCollection> MyObjCollection;
        {
            get 
            {
                if (MyObjCollection == null || MyObjCollection.Count == 0)
                {
                    MyObjCollection = new System.Collections.ObjectModel.ObservableCollection<MyObjCollection>();
                    MyObjCollection.Add(new MyObjType());
                }
                return MyObjCollection;
            }
            set { MyObjCollection = value; }
        }
}



PM MAIL   Вверх
Vladimir_Petrov
Дата 3.2.2012, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 7.1.2007

Репутация: нет
Всего: нет



Придумал обойти ситуацию. Вместо Button использовать RadioButton контрол (переопределить стиль по-своему). И его свойство привязываю к классу MyObjType какому-нибудь полю. Когда человек кликает по кнопке, изменяется свойство Checked, связанное со свойством моего класса, которое можно связать с логикой программы. Еще конечно не проверял, но чувствую есть проще решение.
PM MAIL   Вверх
Vladimir_Petrov
Дата 10.2.2012, 07:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 7.1.2007

Репутация: нет
Всего: нет



Нашел красивый способ. (код выше тоже работает) Помог ресурс
http://msdn.microsoft.com/ru-ru/library/sy...putbinding.aspx
Код

public class MyObjType : INotifyPropertyChanged
{
        private bool MyProperty
        {
                get;
                set;
        }
        public event PropertyChangedEventHandler PropertyChanged;
        private void NotifyPropertyChange(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
        //Далее, код
        public OnPressListBoxItemCommand OnPressProp
        {
            get { return _OnPressProp; }
        }
        private OnPressListBoxItemCommand _OnPressProp;
        //Констурктор
        public MyObjType()
        {
                _OnPressProp = new OnPressListBoxItemCommand(OnPress);
        }
        public void OnPress(object sender)
        {
            MessageBox.Show("Test");
        }
}
public class OnPressListBoxItemCommand : ICommand
    {
        // Specify the keys and mouse actions that invoke the command. 
        public Key GestureKey { get; set; }
        public ModifierKeys GestureModifier { get; set; }
        public MouseAction MouseGesture { get; set; }

        Action<object> _executeDelegate;

        public OnPressListBoxItemCommand(Action<object> executeDelegate)
        {
            _executeDelegate = executeDelegate;
        }

        public void Execute(object parameter)
        {
            _executeDelegate(parameter);
        }

        public bool CanExecute(object parameter) { return true; }
        public event EventHandler CanExecuteChanged;
    }
public class IAdapter : INotifyPropertyChanged
{
        public event PropertyChangedEventHandler PropertyChanged;
        private void NotifyPropertyChange(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
        public System.Collections.ObjectModel.ObservableCollection<MyObjCollection> MyObjCollection;
        {
            get 
            {
                if (MyObjCollection == null || MyObjCollection.Count == 0)
                {
                    MyObjCollection = new System.Collections.ObjectModel.ObservableCollection<MyObjCollection>();
                    MyObjCollection.Add(new MyObjType());
                }
                return MyObjCollection;
            }
            set { MyObjCollection = value; }
        }
}

XAML
Код

<Button x:Name="MyItemBitton" Content="Button" Command="{Binding OnPressProp}".../>

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




[ Время генерации скрипта: 0.0578 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.