2012-12-05 47 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属性,但它看起来更像是一个肮脏的解决方法。实际上微软必须对如何实现这样的事情有一些了解。 –