2012-03-22 2 views
1

배경 :MVVM에서 사용자 정의 컨트롤에 데이터 전달

사용자 정의 컨트롤을 포함하는 주 창을 가진 WPF 응용 프로그램이 있습니다. 주 창에서 사용자 정의 컨트롤로 값을 전달하고 싶습니다. 메인 윈도우의 생성자에서

내가 가진 코드 :

public UserControl1() 
    { 
     InitializeComponent(); 
     this.ID = ID.GetNewID; 
    } 

    public UserControl1(string name) 
    { 
     InitializeComponent(); 
     _vm = new UCViewModel(name); 
     this.DataContext = _vm; 
     this.ID = ID.GetNewID; 
    } 

문제는 다음과 같습니다 :

사용자 제어는 두 개의 생성자가

public MainWindow() 
    { 
     InitializeComponent(); 
     _vm = new MainWindowViewModel(); 
     this.DataContext = _vm; 
     ucControl = new UserControl1("NameSet"); 
    } 

(ucControl 내 사용자 컨트롤입니다)

하지만 두 번째 생성자 (매개 변수 사용)가 호출되면 기본 창에로드되지 않습니다. ID (this.ID) 사용자 정의 컨트롤의로드 된 이벤트 확인 및 ID를 기본 생성자 및 해당 DataContext null 집합을 참조하십시오. 이러한 이유 때문에 사용자 컨트롤에 "이름"문자열이 표시되지 않습니다.

도움이 필요하십니까? MVVM 패턴을 사용하고 있기 때문에 사용자 컨트 롤 (뷰)의 속성을 기본 창에서 설정되도록 노출하고 싶지 않습니다.

+0

거기에서이 usercontrol을로드 했습니까? –

+0

사용자 컨트롤이 주 창의 xaml에 있습니다. thewpfguy

+0

나는 질문 http://stackoverflow.com/questions/4802278/how-do-you-pass-parameters-from과 비슷한 것 같다 -xaml. 도움이 될 것입니다. –

답변

1

당신은 두 번 UserControl1을 개체를 인스턴스화됩니다

  1. 을 일단 XAML에서. < uc : UserControl1 > 요소는 기본 생성자를 사용하여 UserControl1 개체를 인스턴스화하고이를 ucControl 멤버에 할당합니다.

  2. 당신은 MainWindow를 객체 당신의 UserControl의 생성자에서 중단 점을 넣으면

의 생성자 내에서 다시 인스턴스화, 당신은 그것을 두 번이라고 알 수 있습니다. 난 WPF 인스턴스화 및 동적 UserControl (위의 # 2) 할당 한 후 XAML의 UserControl (위의 # 1) 초기화 및이 이유는 MainWindow 논리 트리에서 볼 수 있습니다.

인스턴스는 하나만 있어야합니다. 사용자 정의 컨트롤을 매개 변수화하려는 경우 정식 패러다임은 사용자가 원하지 않는 것 (왜?)을 말합니다. 당신이 그런 속성을 가지고 있다면, 당신은 XAML에서 설정할 수 : < UC를 : UserControl1에의 X를 : 이름 = "..."YourProperty는 = "같은 속성을 노출 NameSet이 >

UserControl을 단일 라인 :

.이 라인을 가지고 있지의 주장하면
public YourProperty { get; set; } 

, 다음을 수행해야합니다 : 메인 창에서

    1. 을 제거 XAML의 사용자 컨트롤을로드 이벤트에 가입
    2. Loaded 이벤트의 처리기에서 원하는 생성자 매개 변수를 사용하여 새 UserControl1을 인스턴스화합니다.
    3. 수동 그것은 분명이 내 추천하지 않습니다 부모 Grid 요소

    의 아이 배열에 추가 할 수 있습니다.복잡성 외에도 이전 방법을 사용하면 Visual Studio 디자이너와도 잘 작동합니다.

  • +1

    답장을 보내 주셔서 감사합니다. 사용자 정의 컨트롤의 뷰 모델에 "name"속성이 있습니다. 어떻게 설정합니까? 물론 이것은 작동하지 않습니다 - thewpfguy

    +0

    우리는 사용자 컨트롤 클래스의 뷰 모델에서 모든 속성을 복제해야합니까? – thewpfguy

    +0

    그것은 DataContext.Name에 실패하고 코드의 ucControl.DataContext에 액세스합니다. – Silvermind

    관련 문제