如何将 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
.
目标:将绑定到 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
.