Junaid Shaikh
Junaid Shaikh

Reputation: 39

How do i set ComboBoxItem as selected from the button inside it?

Goal: To set item as selected on button click (Button is inside the ComboBoxItem) which is Binded to DeleteItemCommand.

Progress: I am getting the command fired successfully. And by selecting the item first later clicking the button successfully deletes the comboboxitem.

Xaml:

     <ComboBox 
          HorizontalAlignment="Center" 
          VerticalAlignment="Center" 
          Width="149" 
          ItemsSource="{Binding LoadCustomValue}" 
                <ComboBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <TextBlock Text="{Binding CustomValueName}"/>
                            <Button Command="{Binding ElementName=root, 
                                             Path=DataContext.Command}" 
                                    CommandParameter="{Binding}"
                                    Content="Delete" />
                        </StackPanel>
                    </DataTemplate>
                </ComboBox.ItemTemplate>
     </ComboBox>

RelayCommand.cs

public class RelayCommand : ICommand
    {
        private Action<object> execute;
        private Func<object, bool> canExecute;

        public event EventHandler CanExecuteChanged
        {
            add { CommandManager.RequerySuggested += value; }
            remove { CommandManager.RequerySuggested -= value; }
        }

        public RelayCommand(Action<object> execute, Func<object, bool> canExecute = null)
        {
            this.execute = execute;
            this.canExecute = canExecute;
        }

        public bool CanExecute(object parameter)
        {
            return this.canExecute == null || this.canExecute(parameter);
        }

        public void Execute(object parameter)
        {
            this.execute(parameter);
        }
    }

ViewModel:

class ViewModel: INotifyPropertyChanged
    {
        private ObservableCollection<SavedCustomValue> _loadCustomValue;
        private SavedCustomValue _selectedValue;

        public event PropertyChangedEventHandler PropertyChanged;
        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }

        public SavedCustomValue SelectedValue
        {
            get { return _selectedValue; }
            set { _selectedValue = value; }
        }
        public ObservableCollection<SavedCustomValue> LoadCustomValue
        {
            get { return _loadCustomValue; }
            set { _loadCustomValue = value;
                OnPropertyChanged();
            }
        }
        public ViewModel()
        {
            _loadCustomValue = new ObservableCollection<SavedCustomValue>()
            {
                new SavedCustomValue(){ CustomValueName="Custom Value 1"   },
                new SavedCustomValue(){ CustomValueName="Custom Value 2"   },
                new SavedCustomValue(){ CustomValueName="Custom Value 3"   }
            }; 
        }
        p private ICommand _command;

        public ICommand Command
        {
            get
            {
                return _command ?? (_command = new RelayCommand(
                   x =>
                   {
                       Execute();
                   }));
            }

        }
        private void Execute()
        {
            LoadCustomScan.Remove(SelectedScan);
            MessageBox.Show(LoadCustomScan.Count.ToString());
        }
        public class SavedCustomValue
        {
            public string CustomValueName { get; set; }          
        }
    }

I am totally new in Wpf so consider explaining me please.

Upvotes: 1

Views: 120

Answers (1)

aepot
aepot

Reputation: 4824

Since you pass the parameter, you aren't using it. Use it:

private ICommand _myCommand;
public ICommand MyCommand => _myCommand ?? (_myCommand = new RelayCommand(parameter =>
{
    if (parameter is SavedCustomValue v)
    {
        LoadCustomValue.Remove(v);
        MessageBox.Show(LoadCustomValue.Count.ToString());
    }
}));

Also don't name the command as Command to avoid conflict with standard Command class. I renamed it to MyCommand.

Upvotes: 1

Related Questions