如何解决如何将ComboBoxItem设置为从其内部的按钮中选择的位置?
目标:要设置按钮上的选定项,请单击(绑定在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
,以避免与标准Command类冲突。我将其重命名为MyCommand
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。