2009-09-30 71 views
2

我有一個包含用戶名文本框和密碼框的登錄表單。使用MultiBinding綁定元素

我希望僅當兩個字段都包含值時才能啓用ok按鈕。

我有一個轉換器,檢查所有的字符串,如果他們爲空或空。

我在Convert方法的第一行放置了一個斷點,並且它僅在MenuItem初始化後綴時停止,即,當我改變它沒有的文本時。

以下示例運行良好,問題在於當我更改文本時未觸發多重綁定;它只是綁定初始化表單時:

<!--The following is placed in the OK button--> 
<Button.IsEnabled> 
    <MultiBinding Converter="{StaticResource TrueForAllConverter}"> 
     <Binding ElementName="tbUserName" Path="Text"/> 
     <Binding ElementName="tbPassword" Path="Password"/> 
    </MultiBinding> 
</Button.IsEnabled> 

我認爲這個問題是你當遠程綁定源改變不會得到通知(例如沒有在那裏設置UpdateTargetTrigger="PropertyChanged"選項

所有。想法?

+0

您可以爲您的tbUserName和tbPassword控件以及TrueForAllConverter資源的聲明添加XAML嗎? – 2009-09-30 05:13:25

+0

我認爲傑瑞在正確的軌道上。您需要將UpdateSourceTrigger屬性添加到TextBox上的綁定中,以便MultiBinding在它們更改時得到通知,而不僅僅在焦點離開控件時纔會收到通知。 – 2009-09-30 05:25:15

+0

我不會迴應,如果我不會雷伊,並看到它不起作用。關於TrueForAllConverter的 我在Convert方法的頂部放置了一個斷點,它僅在MenuItem初始化時停止,所以我們不關心轉換器中的內容,我們擔心它應該首先嚐試觸及它。 如果你真的好奇轉換器告訴我什麼,我會發布它,即使我認爲它的地方不在這裏。 – Shimmy 2009-09-30 07:11:26

回答

2

我建議你看看命令綁定。一個命令可以根據某些條件自動啓用或禁用登錄按鈕(即用戶名和密碼不爲空)。

public static RoutedCommand LoginCommand = new RoutedCommand(); 

private void CanLoginExecute(object sender, CanExecuteRoutedEventArgs e) 
{ 
    e.CanExecute = !string.IsNullOrEmpty(_userInfo.UserName) && !string.IsNullOrEmpty(_userInfo.Password); 
    e.Handled = true; 
} 

private void LoginExecute(object sender, ExecutedRoutedEventArgs e) 
{ 
    MessageBox.Show("Loging in..."); 
    // Do you login here. 
    e.Handled = true; 
} 

XAML命令綁定將是這個樣子

<TextBox Text="{Binding UserName, UpdateSourceTrigger=PropertyChanged}" /> 
<TextBox Text="{Binding Password, UpdateSourceTrigger=PropertyChanged}" /> 
<Button Command="local:LoginWindow.LoginCommand" >Login</Button> 

要在XAML

<Window.CommandBindings> 
    <CommandBinding Command="local:LoginWindow.LoginCommand" CanExecute="CanLoginExecute" Executed="LoginExecute" /> 
</Window.CommandBindings> 

或者代碼註冊落後

public LoginWindow() 
{ 
    InitializeComponent(); 

    CommandBinding cb = new CommandBinding(LoginCommand, CanLoginExecute, LoginExecute); 
    this.CommandBindings.Add(cb); 
} 

更多readigin here命令。

+0

+1 ......如果你還提到命令綁定的原因是因爲* PasswordBox *上的* Password *屬性不是依賴項屬性,它可以爲人們節省一點搜索空間通知它已經改變。 [這裏是一篇很好的博客文章](http://blog.functionalfun.net/2008/06/wpf-passwordbox-and-data-binding.html)。 – slugster 2010-06-28 02:03:46

0

嘗試將UpdateSourceTriggerPropertyChangedModeTwoWay。這將導致在您鍵入的屬性被更新。不知道這是否會與你的轉換工作,雖然。

+0

我試過以上,它不起作用。 – Shimmy 2009-09-30 07:13:22

0
Private Sub tb_Changed(sender As Object, e As RoutedEventArgs) _ 
     Handles tbUsername.TextChanged, _ 
       tbPassword.PasswordChanged 
    btnOk.IsEnabled = tbUsername.Text.Length > 0 _ 
       AndAlso tbPassword.Password.Length > 0 
End Sub