Reputation: 39
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
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