Правя първите си стъпки в използването на команди (чрез внедряване на интерфейса ICommand
) в моите Windows Phone приложения. Сега се натъкнах на проблем, който изглежда не мога да разбера. Свързвам контрола, в този случай това е текстово поле, към свойството CommandParameter
на Button
:
<Button x:Name="BTN_Search"
Style="{StaticResource ButtonNoPressedStyle}"
BorderThickness="0"
ccontrols:TiltEffect.IsTiltEnabled="True"
Grid.Column="1"
Height="85"
Margin="0,0,0,-2"
CommandParameter="{Binding ElementName=TB_Search}"
Command="{Binding SearchTermCommand}">
<Button.Background>
<ImageBrush ImageSource="/Assets/Images/searchbtn.png" />
</Button.Background>
</Button>
Когато приложението стартира и моделът на изглед се инстанцира, методът CanExecute
се задейства два пъти подред.
public override bool CanExecute(object parameter)
{
if (parameter != null)
{
var textbox = parameter as TextBox;
if ((textbox.DataContext as MainPageViewmodel).SearchTerm == null)
{
(textbox.DataContext as MainPageViewmodel).SearchTerm = "";
return true;
}
else if (String.IsNullOrWhiteSpace(textbox.Text)) return false;
else if (textbox.Text.Any(Char.IsDigit)) return false;
else if (textbox.Text.Length < 4) return false;
else if (_commandExecuting) return false;
else
{
var bindingExpression = textbox.GetBindingExpression(TextBox.TextProperty);
bindingExpression.UpdateSource();
return true;
}
}
return true;
}
Първият път параметърът е null
, а вторият път съдържа текстовото поле. Поради това поведение трябва да направя така, че тези първи два пъти методът CanExecute
да връща true, в противен случай бутонът ще бъде деактивиран.
Четох някои други теми, че може да има връзка с RaiseCanExecuteChanged()
, но и в това не съм толкова сигурен. Този въпрос има някои отговори относно този проблем, но отговорите не отговарят на нуждите ми, тъй като повечето решения са за WPF (с помощта на CommandManager
или IMultiValueConverter
), а други изглежда не работят.
Има ли някакво решение да се уверите, че CanExecute
се задейства само веднъж или какво е обяснението за това поведение?