Как получить доступ к параметру команды, переданному в функцию при использовании Fody Commander
Я пытаюсь использовать Fody Commander для реализации команды входа в систему.
Моя кнопка входа в систему XAML выглядит так:
<Button x:Name="button"
IsDefault="True"
Command="{Binding SignInCommand}"
Style="{DynamicResource AccentedSquareButtonStyle}"
Grid.Column="1" Grid.Row="0" Grid.RowSpan="2" Margin="10">
<Button.CommandParameter>
<MultiBinding Converter="{StaticResource SignInConverter}">
<Binding Path="Text" ElementName="UserName" />
<Binding ElementName="Password" />
</MultiBinding>
</Button.CommandParameter>
<TextBlock FontSize="{DynamicResource NormalFontSize}">Sign In</TextBlock>
</Button>
В моей ViewModel у меня есть это:
[OnCommand("SignInCommand")]
public void OnSignIn()
{
//Need to access the parameters passed from the XAML.
}
Я в растерянности, как получить доступ к параметрам, которые я передал из XAML в OnSignIn().
2 ответа
В конце концов, было невероятно легко передать параметр командам на основе FODY Commander. Я написал небольшой блог на нем. Ссылка - http://ikeptwalking.com/fody-commander-and-wpf-commands/
Как насчет добавления параметра для метода OnSignIn в ViewModel и отправки его в класс, который реализует ICommand? В вашем случае SignInCommand.
public class SignInCommand<T> : ICommand
{
public Action<T> _TargetExecuteMethod;
public Func<T, bool> _TargetCanExecuteMethod;
public SignInCommand(Action<T> executeMethod)
{
_TargetExecuteMethod = executeMethod;
}
public bool CanExecute(object parameter)
{
if (_TargetExecuteMethod != null)
return true;
return false;
}
public event EventHandler CanExecuteChanged;
public void Execute(object parameter)
{
T tParam = (T)parameter;
if (_TargetExecuteMethod != null)
_TargetExecuteMethod(tParam);
}
}
И в конструкторе ViewModel вы инициализируете его так:
signInCommand = new SignInCommand<object>(OnSignIn);
И теперь ваш OnSignInMethod получит нужный вам параметр. Более того, вы также можете поддерживать CanExecuted Func. Он уже присутствует в SignInCommand, просто установите новый параметр в конструкторе, определите его в ViewModel и отправьте его при создании экземпляра.
Я дал довольно простое решение здесь, извините, я не уверен, что такое Фоди, и, к сожалению, у меня нет времени, чтобы проверить это сейчас. Удачи!