我很难理解教程和有关该主题的帖子中的逻辑。我正在尝试在我正在编写的 wpf 应用程序中实现它。
基本上,我使用列表框在列表中显示对象的 ToString,并允许用户通过添加和删除按钮从该列表及其相应的列表框中添加和删除。我遇到的问题是删除按钮的实现。如果没有选择列表框项,我希望禁用该按钮,这是此模式的优点之一。我不知道如何实现该条件。
目前,当我突出显示列表框项目时,该按钮未启用。我想 CanExecuteChanged 事件没有触发。我需要如何更改它?
我的 CommandsHandler 类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;
namespace TechopsTools
{
public class CommandHandler : ICommand
{
private Action<object> _execute;
private bool _canExecute;
public CommandHandler(Action<object> execute)
: this(execute, true)
{
}
public CommandHandler(Action<object> execute, bool canExecute)
{
if (execute == null)
throw new ArgumentNullException("execute");
_execute = execute;
_canExecute = canExecute;
}
public bool CanExecute(object parameter)
{
return _canExecute;
}
public void Execute(object parameter)
{
_execute(parameter);
}
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
}
}
我的视图模型:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using ProtoBuf;
using System.Windows;
using System.ComponentModel;
using System.Collections.ObjectModel;
using System.Windows.Input;
namespace TechopsTools
{
class LogCheckClientViewModel : INotifyPropertyChanged
{
private string uri;
private string response;
private bool _canRemove;
private LogConstraints selectedConstraints;
private ObservableCollection<LogConstraints> constraints;
public event PropertyChangedEventHandler PropertyChanged;
public LogConstraints SelectedConstraints
{
get
{
return selectedConstraints;
}
set
{
selectedConstraints = value;
OnPropertyChanged("SelectedConstraints");
}
}
private CommandHandler removeItemCommand;
public ICommand RemoveItemCommand
{
get
{
if (removeItemCommand == null)
removeItemCommand = new CommandHandler(param => RemoveConstraint(), SelectedConstraints != null);
return removeItemCommand;
}
}
public string Response
{
get
{
return response;
}
set
{
response = value;
OnPropertyChanged("Response");
}
}
public string Uri
{
get
{
return uri;
}
set
{
uri = value;
OnPropertyChanged("Uri");
}
}
public ObservableCollection<LogConstraints> Constraints
{
get
{
return constraints;
}
set
{
constraints = value;
OnPropertyChanged("Constraints");
}
}
public LogCheckClientViewModel()
{
constraints = new ObservableCollection<LogConstraints>();
}
public void AddConstraint()
{
NewConstraint newConstraint = new NewConstraint();
newConstraint.ShowDialog();
if (newConstraint._vm.constraint != null)
{
constraints.Add(newConstraint._vm.constraint);
}
}
private void RemoveConstraint()
{
Constraints.Remove(SelectedConstraints);
OnPropertyChanged("Constraints");
}
xml:
<Window x:Class="TechopsTools.LogCheckClient"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:TechopsTools"
Title="LogCheck" Height="453.057" Width="495.986">
<Grid>
<TextBox Text="{Binding Response}" HorizontalAlignment="Left" Height="128" Margin="38,212,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="413" VerticalScrollBarVisibility="Auto" IsEnabled="False"/>
<Label Content="Response" HorizontalAlignment="Left" Margin="38,188,0,0" VerticalAlignment="Top" Width="78" Height="24"/>
<TextBox Text="{Binding Uri}" HorizontalAlignment="Left" Height="23" Margin="38,26,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="413"/>
<Label Content="Uri" HorizontalAlignment="Left" Margin="38,0,0,0" VerticalAlignment="Top" Width="78" Height="24"/>
<Button Content="Add Constraint" HorizontalAlignment="Left" Margin="38,54,0,0" VerticalAlignment="Top" Width="127" Height="56" Click="Add_Click"/>
<Button x:Name="Submit" Content="Submit Request" HorizontalAlignment="Left" Margin="38,345,0,0" VerticalAlignment="Top" Width="413" Height="70" Click="Submit_Click"/>
<ListBox SelectedItem="{Binding Path=SelectedConstraints,UpdateSourceTrigger=PropertyChanged}" ItemsSource="{Binding Constraints}" HorizontalAlignment="Left" Height="124" Margin="182,54,0,0" VerticalAlignment="Top" Width="269">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Path=description}" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<Button Command="{Binding RemoveItemCommand}" Content="Remove Constraint" HorizontalAlignment="Left" Margin="38,122,0,0" VerticalAlignment="Top" Width="127" Height="56" />
</Grid>
</Window>