2012-02-27 81 views
1

通过复制/粘贴等标准WPF命令,他们似乎都可以使用一个按钮并在文本框上执行操作。我的问题:当我有一个按钮时,如何使用命令,但我需要在两个单独的控件(文本框和组合框)中设置数据。如果用户在文本框中编写了文本,但未选择组合框值,则CanExecute应该失败。这适用于已设置组合框但不包含文本框的情况。作用于两个控件的命令

在我的情况下,所有这些控件都包装在一个tabitem中。另外,我还有另一个只有文本框和按钮的选项卡。我希望它具有与第一个选项卡相同的功能,除了检查组合框值以外,它应检测到没有组合框并传入默认的“空对象”值。

Execute方法应该在我的viewmodel中调用一个方法,并从combobox和textbox传入值。同样,每个选项卡应该传递另一个唯一的静态值;我想我可以使用commandparameter来处理这个问题。

我该如何做这项工作?我是否可以在can/execute方法中将父标签作为commandtarget并直接引用其子控件?

+0

文本框仅仅是一个坏榜样。即使WPF有很多“预定义”的命令,如ApplicationCommands中的命令。其中没有任何事情。它只是为了命名和给命令一个捷径。恰巧TextBox已经实现了这些命令。这就是你需要做的,为你想要的命令提供一个Execute和CanExecute Handler。检查命令绑定的msdn。 – dowhilefor 2012-02-27 21:37:06

+0

嘿dowhilefor,感谢您的提示,但我已经熟悉一般命令的概念,我只需要帮助我的特定情况,我从来没有见过: 1.如何执行命令时,他们的工作两个控件(每个示例仅适用于来自一个控件的输入)。我提出了我提出的解决方案,但它涉及(直接)引用一个控件,这听起来像一个糟糕的主意。 2.解决问题1后,如何区分提供相同功能的两个选项卡? – FZdev 2012-02-27 21:54:26

+0

通常在当前焦点的控件上触发命令。因此,即使您有两个文本框,它们也会分别处理撤销命令,具体取决于焦点所在的位置。你是这个意思吗? – dowhilefor 2012-02-27 22:02:02

回答

0

您需要实现CanExecute方法来检查TextBox数据绑定值和ComboBox.SelectedItem数据绑定值。

以您的问题为例。

您的TextBox.Text应该是数据绑定到您的ViewModel 以及您的组合框。 所以,你的ViewModel应该有两个属性:

public string TextBoxCurrentText {get { ...}set {...}} 
public string ComboBoxCurrentSelected {get { ...}set {...}} 

然后在这两个二传手,你会做你的YourCommmand.RaiseCanExecuteChanged();

所以它会执行你的CanExecute代码块来决定可以将您的按钮点击。 有以下几种:

bool YourCommandCanExecute() 
    { 
//Just example 
     if (!string.IsNullOrEmpty(TextBoxCurrentText) && !string.IsNullOrEmpty(ComboBoxCurrentSelected)) 
      return true; 
     return false; 
    } 
+0

我不确定这个地址是一个关键问题:如果我在第一个选项卡中编写文本并设置组合框值,但不要提交,那么去到第二个标签并写入更多文本并提交。我的viewmodel如何认识到它是第二个标签?毕竟,组合框值仍然设置。 – FZdev 2012-02-27 21:52:31

+0

@FZdev我不知道你是如何实现你的View和ViewModel的。如果每个Tab都是View并且每个View数据绑定到不同的ViewModel,那么您的ViewModel中定义的命令将仅检查该ViewModel中的数据绑定值。即View1数据绑定到ViewModel1,View2数据绑定到ViewModel2。 View1不会影响ViewModel2的工作方式。 – 2012-02-27 21:58:37

+0

我只是用两个tabitems来定义一个tabcontrol。在每个tabitem中,我放入文本框,按钮和(在一种情况下)带有静态定义项目的组合框。 有一个viewmodel具有你推断的两个属性(从以前的解决方案的尝试,但他们仍然存在,我没有使用它们的问题) 真的没什么特别的。多个选项卡只是一个特定的实现,我在初始设计时没有考虑过,但我希望看到什么样的解决方案可以作为学习练习。 – FZdev 2012-02-27 22:01:37