使用相同的字段为WPF窗口烘干C#

时间:2010-08-10 16:03:50

标签: c# wpf refactoring interface dry

我的WPF应用程序中有两个窗口:登录窗口和选项窗口。两者都具有相同的表单,其中包含用户名和密码字段,以及用于提供凭据的其他一些字段。我想要一些知道例如可用的txt_userName TextBox的代码,并且可以基于此做一些事情。我以为我可以创建某种IHaveCredentialsForm接口并让LoginWindowOptionsWindow实现它,但是当我尝试时,我得到了''MyNamespace.LoginWindow'没有实现接口成员'MyNamespace.IHaveCredentialsForm.txt_userName'”。到目前为止,这是我的界面:

interface IHaveCredentialsForm
{
    TextBox txt_userName { get; set; }
}

我原以为自己收到了错误,因为LoginWindow是继承自partial的{​​{1}}类。我绝对可以在Window的方法中访问名为TextBox的{​​{1}},但我没有明确定义这样的属性。我假设在LoginWindow.xaml中有一个txt_userName具有该名称,这神奇地出现了。

我怎样才能干这个?我已经有了一个方法来处理用户名,密码等LoginWindow值的东西,但是有两个不同的类传入TextBox似乎是多余的 - 与同样的方法。

虽然我在这,但我怎么能在两个不同的窗口之间共享一大块XAML(凭证格式)?

2 个答案:

答案 0 :(得分:3)

您可以通过creating可重复使用的user control来解决这个问题,您可以将这两种形式放在这两个表单上。

答案 1 :(得分:1)

我会将逻辑从代码中移出并进入一个单独的类。然后使用数据绑定将类中的属性链接到UI中的文本框。

类似的东西:

//ViewModel class
public class UserViewModel
{
    public string Username { get; set; }
    public string Password { get; set; }
}

<!--View XAML-->
<TextBox x:Name="txt_username" Text="{Binding Username}" />
<TextBox x:Name="txt_password" Text="{Binding Password}" />

这不仅会阻止您重复自己,而且是很好的做法,因为它可以让您分别从UI测试业务逻辑代码。

对于WPF,这种类型编程的流行设计是MVVM模式。有一个问题here可以帮助您掌握基础知识,并在更广泛的网络中提供大量的教程。

将所有逻辑移出后,您可以创建一个UserControl来保存两个文本框(及其绑定)的XMAL,这两个文本框可以在两个视图中使用,这样您就不会重复这些。


使用这种方法的几个快速说明:

  • 确保在viewmodel上实现INotifyPropertyChanged以使绑定正常工作
  • 如果您在XAML中使用PasswordBox,则有一些gotchas regarding databinding