2011-03-02 207 views
1

我有一個在usercontrol內實現ValidationRule的文本框,它工作正常,現在在我正在使用此控件的窗口中有一個按鈕,我希望該按鈕是禁用如果usercontrol內的文本框無效如何檢查UserControl是否有效

回答

0

這裏的技巧是使用命令,而不是點擊事件。一個命令包含確定命令是否有效的邏輯以及執行該命令時要運行的實際代碼。

我們創建一個命令,並將按鈕綁定到它。如果Command.CanExecute()返回false,該按鈕將自動禁用。使用命令框架有很多好處,但我不會在這裏討論。

下面是一個應該讓你開始的例子。 的XAML:

<StackPanel> 
    <Button Content="OK" Command="{Binding Path=Cmd}"> 
    </Button> 
    <TextBox Name="textBox1"> 
     <TextBox.Text> 
      <Binding Path="MyVal" UpdateSourceTrigger="PropertyChanged" > 
       <Binding.ValidationRules> 
        <local:MyValidationRule/> 
       </Binding.ValidationRules> 
      </Binding> 
     </TextBox.Text> 
    </TextBox> 
</StackPanel> 

的用戶控件代碼隱藏(這可能是類似於您已經有了,但我將它來說明如何創建命令):

public partial class UserControl1 : UserControl 
{ 
    private MyButtonCommand _cmd; 
    public MyButtonCommand Cmd 
    { 
     get { return _cmd; } 
    } 

    private string _myVal; 
    public string MyVal 
    { 
     get { return _myVal; } 
     set { _myVal = value; } 
    } 

    public UserControl1() 
    { 
     InitializeComponent(); 
     _cmd = new MyButtonCommand(this); 
     this.DataContext = this; 
    } 
} 

的命令類。這個類的目的是決定命令是否有效使用驗證系統,並刷新它的狀態時TextBox.Text變化:

public class MyButtonCommand : ICommand 
{ 
    public bool CanExecute(object parameter) 
    { 
     if (Validation.GetHasError(myUserControl.textBox1)) 
      return false; 
     else 
      return true; 
    } 

    public event EventHandler CanExecuteChanged; 
    private UserControl1 myUserControl; 

    public MyButtonCommand(UserControl1 myUserControl) 
    { 
     this.myUserControl = myUserControl; 
     myUserControl.textBox1.TextChanged += new TextChangedEventHandler(textBox1_TextChanged); 
    } 

    void textBox1_TextChanged(object sender, TextChangedEventArgs e) 
    { 
     if (CanExecuteChanged != null) 
      CanExecuteChanged(this, EventArgs.Empty); 
    } 

    public void Execute(object parameter) 
    { 
     MessageBox.Show("hello"); 
    } 
} 
+0

謝謝您的回答,但實際上我並不需要內部按鈕無論如何,我想出了一個解決方案,我在我的用戶控件'IsValid'內添加了一個屬性,並將其設置爲Validation.Error事件,並且我在託管窗口的CanExecute事件按鈕中使用了此屬性。所以它工作正常。 – Ali