【问题标题】:How do i set ComboBoxItem as selected from the button inside it?如何将 ComboBoxItem 设置为从其中的按钮中选择?
【发布时间】:2020-12-18 18:25:19
【问题描述】:

目标:将绑定到 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);
        }
    }

视图模型

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 的新手,所以请考虑解释一下。

【问题讨论】:

  • 使用 RelayCommand 类 - Relaying Command Logic。然后将CommandParameter="{Binding}" 传递给命令。然后你就不需要绑定SelectedItem了。
  • 错误:将SelectedValue=改为SelectedItem=。提示:Mode=TwoWay 是这里的默认值,你可以不明确设置。
  • 现在将尝试并恢复。谢谢
  • 谢谢。我不知道 [CallerMemberName] 有这个好处。你能告诉我我在上面的代码中遗漏了什么或什么,因为我还不能删除该项目。谢谢你的时间。我很感激。
  • 注意!非常感谢。 @aepot

标签: c# wpf xaml binding command


【解决方案1】:

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

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,以避免与标准命令类冲突。我将其重命名为MyCommand

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多