Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > Отловить нажатие кнопки в ListBox Item+DataBinding


Автор: Vladimir_Petrov 2.2.2012, 21:52
Изучаю 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; }
        }
}



Автор: Vladimir_Petrov 3.2.2012, 12:49
Придумал обойти ситуацию. Вместо Button использовать RadioButton контрол (переопределить стиль по-своему). И его свойство привязываю к классу MyObjType какому-нибудь полю. Когда человек кликает по кнопке, изменяется свойство Checked, связанное со свойством моего класса, которое можно связать с логикой программы. Еще конечно не проверял, но чувствую есть проще решение.

Автор: Vladimir_Petrov 10.2.2012, 07:36
Нашел красивый способ. (код выше тоже работает) Помог ресурс
http://msdn.microsoft.com/ru-ru/library/system.windows.input.inputbinding.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}".../>

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)