我正在使用Windows Phone应用程序中的命令(通过实现ICommand
接口)迈出第一步。现在我遇到了一个我似乎无法弄清楚的问题。我将一个控件(在本例中是一个文本框)绑定到CommandParameter
的{{1}}属性:
Button
当应用程序启动并实例化viewmodel时,<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
方法返回true,否则按钮将被禁用。
我已经阅读了一些与CanExecute
可能有关的其他主题,但我也不太确定。
这question
关于这个问题有一些答案,但答案不符合我的需要,因为大多数解决方案都适用于WPF(使用RaiseCanExecuteChanged()
或CommandManager
)而其他解决方案似乎不起作用。
是否有任何解决方案可以确保IMultiValueConverter
仅触发一次,或者对此行为的解释是什么?
答案 0 :(得分:0)
我认为当命令参数第一次有界时,你的文本框没有被初始化。尝试使用twoway模式将textbox与viewmodel参数绑定(参数必须为DependencyProperty或者viewmodel必须实现INotifyPropertyChanged接口),然后将此参数传递给命令参数。
答案 1 :(得分:0)
这个答案没有提供任何明确的结论,但在我使用CommandParameter
上的各种绑定进行测试并查看Microsoft为ICommand接口提供的information以及相关的{{ 1}}事件,我必须得出结论,它与McGarnagle已经建议的以下任何一个有关:
这是合理的,因为文档说出以下内容:&#34;当发生影响命令是否应该执行的更改时发生。&#34;
我注意到了:
CanExecuteChanged
。null
在启动时被激活两次。该参数是CanExecute
第一次,第二次包含元素或指定元素的属性。null
时,CanExecute在启动时被激活一次,参数包含Button元素。正如我之前所说的,这并没有回答任何问题,但我认为提供一些关于此事的额外信息不会受到伤害。如果有人找到明确的答案,提供为什么这种行为,我当然会很感激。
无论如何,我在我自己的应用程序中使用了第一个场景并重新构建了逻辑,所以现在它按照我最初的预期工作。