2016-12-10 2 views
-1
public ICommand OpenDialogFile 
     { 
      get 
      { 
       return new DelegateCommand<RichEditBox>(OpenDialogToAttach); 
      } 
     } 

Command="{Binding OpenDialogFile}" CommandParameter="{Binding ElementName=TweetEditBox}" 

Итак, DeledateCommand действительно знает о RichEditBox. Хотя я использую «Неопределенный тип 'DelegateCommand' не может использоваться с аргументами типа

OpenDialogToAttach (RichEditBox editBox)".

Как это решить ?. Я дебютирую на UWP.

Вот DelegateCommand Code.Initializes новый экземпляр класса DelegateCommand, что

internal class DelegateCommand : ICommand 
{ 
    private readonly Action _execute; 

    private readonly Func<bool> _canExecute; 

    /// <summary> 
    /// Initializes a new instance of the RelayCommand class that 
    /// can always execute. 
    /// </summary> 
    /// <param name="execute">The execution logic.</param> 
    /// <exception cref="ArgumentNullException">If the execute argument is null.</exception> 
    public DelegateCommand(Action execute) 
     : this(execute, null) 
    { 
    } 

    /// <summary> 
    /// Initializes a new instance of the RelayCommand class. 
    /// </summary> 
    /// <param name="execute">The execution logic.</param> 
    /// <param name="canExecute">The execution status logic.</param> 
    /// <exception cref="ArgumentNullException">If the execute argument is null.</exception> 
    public DelegateCommand(Action execute, Func<bool> canExecute) 
    { 
     if (execute == null) 
     { 
      throw new ArgumentNullException("execute"); 
     } 

     _execute = execute; 
     _canExecute = canExecute; 
    } 

    /// <summary> 
    /// Occurs when changes occur that affect whether the command should execute. 
    /// </summary> 
    public event EventHandler CanExecuteChanged; 

    /// <summary> 
    /// Raises the <see cref="CanExecuteChanged" /> event. 
    /// </summary> 
    [SuppressMessage("Microsoft.Design", "CA1030:UseEventsWhereAppropriate", 
     Justification = "This cannot be an event")] 
    public void RaiseCanExecuteChanged() 
    { 
     var handler = CanExecuteChanged; 
     if (handler != null) 
     { 
      handler(this, EventArgs.Empty); 
     } 
    } 

    /// <summary> 
    /// Defines the method that determines whether the command can execute in its current state. 
    /// </summary> 
    /// <param name="parameter">This parameter will always be ignored.</param> 
    /// <returns>true if this command can be executed; otherwise, false.</returns> 
    [DebuggerStepThrough] 
    public bool CanExecute(object parameter) 
    { 
     return _canExecute == null ? true : _canExecute(); 
    } 

    /// <summary> 
    /// Defines the method to be called when the command is invoked. 
    /// </summary> 
    /// <param name="parameter">This parameter will always be ignored.</param> 
    public void Execute(object parameter) 
    { 
     if (CanExecute(parameter)) 
     { 
      _execute(); 
     } 
    } 
} 
+0

который делегат комманды вы используете? шо ваш импорт заявления –

+0

'общественного DelegateCommand (Действие выполнить, Func CanExecute) { если (выполнение == NULL) { певд ArgumentNullException ("выполнить"); } _execute = выполнить; _canExecute = canExecute; } ' –

+0

Вы показываете мне конструктор, не используя инструкцию. Итак, это ваш класс ... вам нужно добавить свое тело к вопросу. Я не думаю, что ваш класс является общим –

ответ

0

Ваш класс DelegateCommand не является общим, поэтому вы не можете его создать с параметром типа RichEditBox, как вы пытаетесь.

У вас есть конструктор, который принимает меры, чтобы вы могли удобно передать лямбда ему захватывая контекст, что нужно, например:

return new DelegateCommand(x => { 
    RichEditBox richBox = (RichEditBox) x; 
    OpenDialogToAttach()... 
}); 
+0

Спасибо. вы .... –

+0

Извините, мой плохой, я заметил, что он принимает действие, а не действие , поэтому у вас нет параметров. –

+0

У вас есть экземпляр вашего RichEditBox в коде? Если да, то вам не нужно ничего пропускать –

0

Реализация в DelegateCommand класса, который вы используете, не поддерживает общий аргумент, который вы пытаетесь перейти к нему.

return new DelegateCommand<RichEditBox>(OpenDialogToAttach) 

Вы можете использовать реализацию DelegateCommand класса от Microsoft.Practices.Composite.Presentation.Commands. Это реализация с общим аргументом.

+0

Это происходит из самородок или где это? Microsoft.Practices.Composite.Presentation.Commands. –

+0

[Это] (https://www.nuget.org/packages/Prism.Core/6.3.0-pre1) является основным пакетом nuget. Я не знаю, является ли это той же реализацией, что и в пакете microsoft. Возможно, вам также нужен пакет [this] (https://www.nuget.org/packages/Prism.Wpf/6.3.0-pre1). – NtFreX

0

Вы найдете реализацию Prism родового класса DelegateCommand для UWP на GitHub: https://github.com/PrismLibrary/Prism/blob/master/Source/Prism/Commands/DelegateCommand%7BT%7D.cs.

Вы можете заменить свою собственную реализацию этим, т. Е. Скопировать определение класса в свой проект. Вам также потребуется базовый класс: https://github.com/PrismLibrary/Prism/blob/master/Source/Prism/Commands/DelegateCommandBase.cs

В качестве альтернативы вы можете установить пакет Prism.Windows используя NuGet (Инструменты-> NuGet пакет Manager-> Диспетчер пакетов консоли в Visual Studio): https://www.nuget.org/packages/Prism.Windows/

... и используйте команду DelegateCommand прямо в вашем коде:

public ICommand OpenDialogFile 
    { 
     get 
     { 
      return new Prism.Commands.DelegateCommand<RichEditBox>(OpenDialogToAttach); 
     } 
    } 
Смежные вопросы