如何将 ComboBoxItem 设置为从其中的按钮中选择?

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

目标:将绑定到 DeleteItemCommand 的按钮单击(按钮位于 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; }          
        }
    }

我是 Wpf 的新手,所以请考虑解释一下。

由于您传递了参数,所以您没有使用它。使用它:

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

也不要将命令命名为Command,以免与标准命令class发生冲突。我将其重命名为 MyCommand.