Предположим, что мне не разрешено использовать классы wpf по умолчанию, интерфейс RoutedCommand, CommandBinding и ICommand. Вместо этого я должен предоставить свою собственную реализацию. Так Уточняю простой интерфейс ICommand:Выполнение шаблона команды в WPF
public interface ICommand
{
void Execute();
}
сделать класс для конкретной команды:
public class NewCommand : ICommand
{
private readonly IReceiver _receiver;
// receiver is any class that provides implementation of a New() method
public NewCommand(IReceiver receiver)
{
_receiver = receiver;
}
public void Execute()
{
_receiver.New();
}
}
Там должно быть Чешуи, а также:
public class Invoker
{
private ICommand _command;
public void SetCommand(ICommand c)
{
_command = c;
}
public void Run()
{
_command.Execute();
}
}
Как подключить все это на XAML, учитывая, что при реализации по умолчанию мой код выглядит так:
public class DesignerCanvas : Canvas
{
private readonly IDesignerCommandsReceiver _receiver;
public DesignerCanvas()
{
_receiver = new DesignerCommandsReceiver(this);
CommandBindings.Add(new CommandBinding(ApplicationCommands.New, New_Executed));
}
private void New_Executed(object sender, ExecutedRoutedEventArgs e)
{
_receiver.New();
}
}
И кнопка, которая вызывает новую команду переплетен как:
<Button Margin="3" Width="55" Style="{StaticResource ToolBarButtonBaseStyle}"
Command="{x:Static ApplicationCommands.New}"
CommandTarget="{Binding ElementName=MyDesigner}">
<Button.Content>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="4*"/>
<RowDefinition Height="1*"/>
</Grid.RowDefinitions>
<Image Source="Images/GenericDocument.png" Width="45"/>
<TextBlock Grid.Row="1" Text="New" VerticalAlignment="Bottom" HorizontalAlignment="Center"/>
</Grid>
</Button.Content>
</Button>
Как связать мой класс NewCommand если атрибут Command ожидает класс, который реализует System.Windows.Input.ICommand? Где я могу создать экземпляр Invoker, установите NewCommand и запустите его? Вообще говоря, я немного смущен тем, как заменить стандартную реализацию шаблона моим собственным. Любые советы приветствуются.
Это не имеет смысла. Объект, которому назначено свойство 'Command' Button, должен реализовать' System.Windows.Input.ICommand'. – Clemens
Возможно, мой пользовательский интерфейс ICommand должен наследовать от System.Windows.Input.ICommand? Или есть работа с использованием атрибута Click? – eXPerience
«Как связать мой класс NewCommand, если атрибут Command ожидает класс, который реализует System.Windows.Input.ICommand?" Вы не можете. Вы должны установить свойство Command Button для объекта, который реализует встроенный интерфейс ICommand. – mm8