【发布时间】: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