2012-12-05 75 views
0

C#中的我的WPF應用程序使用MVVM模式。還有我已經定義了兩個用戶控件:無法在單獨的視圖中找到ElementName的源

  • LoginView
  • ProjectsView

兩個用戶控件添加到主窗口,並使用相同的視圖模型。該LoginView包含PasswordBox定義如下:

<PasswordBox Name="passwordBox" IsEnabled={Binding PasswordEnabled} />

ProjectsView包含定義一個按鈕,如下所示:

<Button Content="Login" Command="{Binding ProjectLoginCommand}" IsEnabled={Binding ProjectLoginEnabled}" CommandParameter="{Binding ElementName=passwordBox}" />

當啓動應用程序看來,如果該元素的名稱passwordBox不能界。該錯誤信息是:

Cannot find source for binding with reference 'ElementName=passwordBox' [...]

我該如何解決這個問題?

+0

爲什麼你需要一個PasswordBox控件作爲你的CommandParameter? –

+0

單擊按鈕時,我需要密碼值(PasswordBox.Password)。但是由於安全原因,不可能直接綁定它。這就是爲什麼幾篇文章提出將完整控制作爲命令參數傳遞,然後訪問PasswordBox.Password。 –

+0

爲什麼不嘗試下面的代碼:PasswordBox s = sender作爲PasswordBox; ViewModel.Password = s.Password;爲PasswordBox_PasswordChanged事件處理程序 –

回答

1

你的元素

<PasswordBox Name="passwordBox" IsEnabled={Binding PasswordEnabled} /> 

位於LoginView用戶的控制,但按鍵

<Button Content="Login" Command="{Binding ProjectLoginCommand}" IsEnabled={Binding ProjectLoginEnabled}" CommandParameter="{Binding ElementName=passwordBox}" /> 

位於ProjectsView。問題是您想要從另一個用戶控件的一個用戶控件子元素進行訪問。在我看來,它應該是更好的解決方案,將LoginView用戶控件中的所有登錄用戶界面和ProjectsView用戶控件中的「項目」用戶界面封裝起來。

+0

這裏的問題是,我還需要在'ProjectsView'的元素/命令中的PasswordBox中輸入密碼。然後我會有相同的問題,反之亦然:-) –

+0

如果你使用相同的ViewModel作爲你的兩個控件,你可以在ViewModel中添加一些「Password」屬性,在你的LoginView中設置這個屬性並通過Binding在ProjectsView中使用它。 – EugenSoft

+0

是的,這可行。但是這會違反soem安全問題,對嗎?我現在創建了一個PasswordBox屬性,但它看起來更像是一個骯髒的解決方法。實際上微軟必須對如何實現這樣的事情有一些瞭解。 –