Если я правильно понял ваш Вопрос, вы хотите знать, почему ICommand
в ViewModel
не установлено на DelegateCommand
, определенное в Behaviour
.
Проблема в том, чтоICommand
и DelegateCommand
не имеют прямого соединения.Я предполагаю, что вы можете неправильно понять, как Binding
работает и что происходит, используя их.
Прежде всего, ICommand
- это "исходит" из Class
и поэтому является ссылочным типом.
Во-вторых, ссылка на ICommand
сохраняется в DependencyProperty
ClearTextCommandProperty
.
В-третьих, при использовании Binding
в XAML
что-то вроде этого происходит в виде кода C #:
Binding binding = new Binding();
binding.Path = new PropertyPath("ClearTextCommand");
binding.Source = ClearCommand;
BindingOperations.SetBinding(TextBox.ClearTextCommandProperty, binding);
Теперь важная вещь: я не знаю точно, какое назначение приходитсначала, но обе строки переопределят ссылку Value
в ClearTextCommandProperty
!
//either here
SetBinding(TextBox.ClearTextCommandProperty, binding);
//or here
ClearTextCommand = new DelegateCommand(ClearTextCommandExecuted);
//Which could be written as
SetValue(ClearTextCommandProperty, new DelegateCommand(ClearTextCommandExecuted));
Ни в коем случае не существует такого назначения:
ViewModel.ClearCommand = SomeICommand;
Следовательно, это Null
, как сказал @Andy
Отредактировано, чтобы соответствовать, выбрать весь текст
Кроме того, я предлагаю вам отбросить этот сложный материал и использовать весь потенциал пакета Interactivity
, как это:
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
<Button>
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<utils:SelectAllText TargetName="TextToSelect"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
<TextBox x:Name="TextToSelect" Text="{Binding File}"/>
ИSelectAllText
public class SelectAllText : TargetedTriggerAction<TextBox>
{
protected override void Invoke(object parameter)
{
if (Target == null) return;
Target.SelectAll();
Target.Focus();
}
}