Windows Phone - 将TextBox或其他控件绑定到Button的CommandParameter

时间:2014-05-16 20:33:19

标签: c# xaml windows-phone-8 icommand

我正在使用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仅触发一次,或者对此行为的解释是什么?

2 个答案:

答案 0 :(得分:0)

我认为当命令参数第一次有界时,你的文本框没有被初始化。尝试使用twoway模式将textbox与viewmodel参数绑定(参数必须为DependencyProperty或者viewmodel必须实现INotifyPropertyChanged接口),然后将此参数传递给命令参数。

答案 1 :(得分:0)

这个答案没有提供任何明确的结论,但在我使用CommandParameter上的各种绑定进行测试并查看Microsoft为ICommand接口提供的information以及相关的{{ 1}}事件,我必须得出结论,它与McGarnagle已经建议的以下任何一个有关:

  • 对可视树的更改。
  • 对依赖项属性/对象的更改。

这是合理的,因为文档说出以下内容:&#34;当发生影响命令是否应该执行的更改时发生。&#34;

我注意到了:

  • 绑定Viewmodel的任何属性时,CanExecute仅在启动时被激活一次。参数为CanExecuteChanged
  • 当绑定任何其他元素此元素的属性时,null在启动时被激活两次。该参数是CanExecute第一次,第二次包含元素或指定元素的属性。
  • 绑定Button本身null时,CanExecute在启动时被激活一次,参数包含Button元素。

正如我之前所说的,这并没有回答任何问题,但我认为提供一些关于此事的额外信息不会受到伤害。如果有人找到明确的答案,提供为什么这种行为,我当然会很感激。

无论如何,我在我自己的应用程序中使用了第一个场景并重新构建了逻辑,所以现在它按照我最初的预期工作。