2010-08-10 1 views
0

WPF 앱에 두 개의 창 (로그인 창과 옵션 창)이 있습니다. 두 가지 모두 사용자 이름 및 암호 필드와 동일한 양식과 자격 증명을 제공하는 다른 필드가 있습니다. 예를 들어, txt_userNameTextBox을 사용할 수 있다는 것을 알고있는 코드를 원하고이를 기반으로 할 수 있습니다. 내가 어떤 종류의 IHaveCredentialsForm 인터페이스를 만들 수 있고 모두 LoginWindowOptionsWindow을 구현할 수 있다고 생각했지만 시도했을 때 " 'MyNamespace.LoginWindow'에 인터페이스 멤버 'MyNamespace.IHaveCredentialsForm.txt_userName'을 구현하지 않았습니다. 여기에 지금까지 내 인터페이스는 다음과 같습니다동일한 필드가있는 WPF 창에 대해 C#을 DRYing합니다.

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

내가 LoginWindowWindow에서 상속 partial 클래스이기 때문에이 오류가 발생했습니다 생각했다. 나는 명확하게 그러한 속성을 정의하지는 않았지만, LoginWindow의 메서드 내에서 txt_userName이라는 TextBox에 확실히 액세스 할 수 있습니다. 그것은 마침내 LoginWindow.xaml에 그 이름을 가진 TextBox이있는 것으로 나타났습니다.

어떻게하면 건조시킬 수 있습니까? 나는 이미 사용자 이름, 패스워드 등을 위해 string 값을 가진 메소드를 가지고 있지만, 동일한 메소드에 동일한 인수 인 txt_userName.Text, pwb_password.Password, ...을 전달하는 두 개의 다른 클래스를 가지고있는 것처럼 보입니다.

두 개의 다른 창 사이에서 XAML (자격 증명 양식)을 어떻게 공유 할 수 있습니까?

답변

3

creating 재사용이 가능한 user control으로 두 가지 양식에 모두 넣을 수 있습니다.

+0

굉장! 나는 사용자 컨트롤 (WPF를 사용하여 최근에 시작)에 익숙하지 않았습니다. 나는 당신의 제안을 이행했다. 내 XAML에 도움이됩니다. –

+0

추가 리팩터링이 끝나면 .xaml이 있으므로 C#도 도움이됩니다.cs 클래스 내 사용자 정의 컨트롤은 내 'txt_userName'필드 등의 작업을 수행합니다. –

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 당신이 기초를 파악하는 데 도움이됩니다, 그리고 튜토리얼의 주위에 넓은 웹 주위에 많이있다.

모든 논리를 이동 한 후에 두 개의 텍스트 상자 (및 해당 바인딩)에 대해 XMAL을 보유하는 UserControl을 만들 수 있습니다. 두 개의 텍스트 상자를 반복하지 않도록 두보기 모두에서 사용할 수 있습니다.


이 방법 빠르게 메모의 몇 :

  • 것은 당신이 다음 거기에 당신이 당신의 XAML에서 PasswordBox의를 사용하는 경우 바인딩 작업을
  • 를 확인하기 위해 뷰 모델에에서 INotifyPropertyChanged를 구현하는 것이 확인 일부 gotchas regarding databinding
관련 문제