Высушивание C # для окон WPF с теми же полями - PullRequest
0 голосов
/ 10 августа 2010

В моем приложении WPF есть два окна: окно входа в систему и окно параметров. Оба имеют одинаковую форму с полем имени пользователя и пароля, а также с некоторыми другими полями для ввода учетных данных. Мне нужен некоторый код, который знает, например, что будет txt_userName TextBox, и может делать что-то на этом основании. Я думал, что мог бы сделать какой-то IHaveCredentialsForm интерфейс и иметь как LoginWindow, так и OptionsWindow, чтобы реализовать его, но когда я попытался, я получил "MyNamespace.LoginWindow" не реализует элемент интерфейса "MyNamespace.IHaveCredentialsForm.txt_userName «». Вот мой интерфейс до сих пор:

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

Я думал, что получил ошибку, потому что LoginWindow - это класс partial, который наследуется от Window. Я определенно могу получить доступ к TextBox, называемому txt_userName, внутри методов LoginWindow, хотя я не определил явно это свойство. Я полагаю, что он волшебным образом возник из-за наличия TextBox с таким именем в LoginWindow.xaml.

Как я могу высушить это? У меня уже есть метод для работы со значениями string для имени пользователя, пароля и т. Д., Но кажется избыточным иметь два разных класса, которые передают txt_userName.Text, pwb_password.Password, ... - те же аргументы для того же метода.

Пока я могу это сделать, как я могу разделить часть XAML (формы учетных данных) между двумя разными окнами?

Ответы [ 2 ]

3 голосов
/ 10 августа 2010

Вы можете высушить это, создав многократно используемый пользовательский элемент управления , который вы можете поместить в обе формы.

1 голос
/ 10 августа 2010

Я бы переместил логику из кода в отдельный класс. Затем используйте привязку данных, чтобы связать свойства класса с текстовыми полями в пользовательском интерфейсе.

Что-то вроде:

//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}" />

Это не только остановит вас от повторения, но и является хорошей практикой, поскольку позволяет тестировать код бизнес-логики отдельно от пользовательского интерфейса.

Для WPF популярным дизайном для этого типа программирования является шаблон MVVM. Здесь есть вопрос здесь , который поможет вам понять основы и множество учебных пособий по более широкой сети.

После того, как вы удалили всю логику, вы можете создать UserControl, который содержит XMAL для двух текстовых полей (и их привязок), который можно использовать в обоих представлениях, чтобы вы не повторяли это тоже.


Несколько быстрых заметок с этим подходом:

  • Убедитесь, что вы реализовали INotifyPropertyChanged в своей модели представления, чтобы привязка работала
  • Если вы используете PasswordBox в своем XAML, то есть несколько ошибок, связанных с привязкой данных
...