2015-10-07 14 views
1

Как я могу сделать параметризованные команды в универсальной платформе Windows без MVVM-фреймворков? Я попытался реализовать класс RelayCommand, но пространство имен System.Windows.Input не имеет класса CommandManager.Универсальная платформа Windows Platform с параметрами

+2

Добро пожаловать на переполнение стека. Можете ли вы сделать свой вопрос более ясным? Что вы пробовали? Что такое сообщение об ошибке? –

+0

использовать [Template10] (https://github.com/Windows-XAML/Template10), поскольку нет смысла изобретать колесо – SWilko

ответ

5

Если вы не хотите использовать фреймворк, вам необходимо реализовать интерфейс System.Windows.Input.ICommand.

Параметры команды могут передаваться свойством CommandParameter. Командующему нет необходимости. Если вы используете одностороннюю привязку для параметра, кнопка будет автоматически включена/отключена при изменении привязки. Для чего-нибудь еще поднимите событие CanExecuteChanged.

Конечно, в более сложном сценарии вам также потребуется реализовать некоторое управление состоянием для этой команды, что проще, если команды определены в режиме просмотра или использования, используют какой-то собственный реализованный менеджер команд ,

упрощенный пример

Вот упрощенный пример, как использовать кнопку с x:Bind связывания. Нет модели просмотра или диспетчера команд.

Example.xaml:

<Button x:Name="Test" Command="{x:Bind FirstCommand}" CommandParameter="{x:Bind SelectedItem, Mode=OneWay"> 
    <TextBlock>Test</TextBlock> 
</Button> 

Example.xaml.cs:

public sealed partial class Example : Page { 

    public SampleCommand FirstCommand { get; set; } = 
     new SampleCommand(); 

    public object SelectedItem { get; set; } 

    public StandardProjectList() { 
     this.InitializeComponent(); 
    } 

} 

SampleCommand.cs:

public class SampleCommand : ICommand { 

    public event EventHandler CanExecuteChanged; 

    public bool CanExecute(object parameter) { 
     return parameter != null; 
    } 

    public void Execute(object parameter) { 
     if (CanExecute(parameter)) 
      //... 
    } 
} 
+0

Это похоже на довольно хороший ответ, но сэкономить на этом усилие. Вышеупомянутый вопрос ленив и без достоинств. Он скорее всего будет закрыт и автоматически удален. Ваш ответ исчезнет вместе с ним. –

+0

@jk хороший ответ требует хорошего вопроса. На самом деле это был отличный вопрос. Не удивительно, что это не было удалено, и ответ не исчез! – usefulBee

Смежные вопросы