2011-11-03 8 views
0

ViewModel (VM)에 바인딩 된 사용자 지정 데이터 입력 폼이 있습니다. 데이터 입력 양식은 사용자가 직원 데이터 (예 : Form 당 1 명의 직원)를 입력 할 수있는 필드를 표시한다고 가정합니다. EmployeeViewModel은 Employee (업데이트 용) 및 많은 콜렉션과 같은 웹 서비스에서 많은 데이터를로드합니다. 이 컬렉션은 "부서"로 구성됩니다. 직원은 많은 부서 중 하나에 속합니다. "감독자", 예. 직원이 감독관에게 배정되는 식입니다. 따라서, 내 VM의 생성자에서 서비스의 FetchData()가 완료 될 때까지 기다려야합니다.내 ViewModel에 하나의 Entity with Child collection 속성을 어떻게로드해야합니까?

그래서 OnLoadComplete에서 반환 된 데이터를 내 VM의 속성 인 Employee에 할당하고 ComboBoxes의 Department와 같은 모든 컬렉션을로드합니다.

내 XAML에서
private Department_selectedDepartment; 
public Department SelectedDepartment 
{ 
    get 
     { return this.Employee.Department; }   **// where error occurs** 
    set 
     { 
      _selectedDepartment = value; 
      this.Employee.Department = value; 
      OnPropertyChanged("SelectedDepartment"); 
     } 
} 

, 나는 컬렉션과 자신의 "선택한 ..."이 - 그래서 같은 부품 : 그들은 다음과 같이 C/B는 VM에

다른 특성은 부하에 NullExceptions 렌더링됩니다

<ComboBox 
    ItemsSource="{Binding Departments, Mode=OneWay}" 
    SelectedItem="{Binding SelectedDepartment, Mode=TwoWay}" /> 

SelectedDepartment의 게터가 VM가로드 명중, 내가 예외를 얻을 수 있도록 this.Employee는 "null 인 것을 말한다.

다른 때까지 기다려야 즉,이 일을하는 방법 직원이 적재 되었습니까?

답변

1

시도하십시오 올바른 부서를 선택 Departments ... 마지막으로 ComboBox 바인딩에 다음 행을 추가합니다.

Departments = new List<Department>(); //feed the collection by service calling result for ComboBox DataSource. 
SelectedDepartment = Employee.Department; //or, SelectedDepartment = Departments[0]; 

희망 사항.

+0

이것은 최고의 대답이라고 생각합니다. 감사합니다! – user118190

1

하나의 옵션은 "null 객체 패턴"을 사용하는 것입니다. 아무것도 표시하지 않는 Department 객체가 있습니다.

그래서, 당신은 당신은 직원 데이터가 수신 될 때 속성 값을 모두 적용 방법의 일종 할 것

private Department _selectedDepartment = new Department { Name = string.Empty }; 
public Department SelectedDepartment 
{ 
    get { return _selectedDepartment; } 

private Department _selectedDepartment; 
public Department SelectedDepartment 
{ 
    get { return this.Employee.Department; } 

을 대체 할 수 있습니다.

바인딩이 앞면에서 작동하고 데이터가 들어올 때 "null"부서가 적절한 값으로 대체 될 수 있습니다.

3

작업 방법은 SelectedDepartment를 단순화 한 다음 직원 개체로드가 완료 될 때 업데이트하는 것입니다. 서비스에서 다음

private Department _selectedDepartment; 
public Department SelectedDepartment 
{ 
    get 
     { return _selectedDepartment;} //return this.Employee.Department; 
    set 
     { 
      _selectedDepartment = value; 
                   //this.Employee.Department = value; 
      OnPropertyChanged("SelectedDepartment"); 
     } 
} 

와 부하 직원, 또한 컬렉션의 모든로드 : 당신의 직원이로드가 완료되면

private Department _selectedDepartment; 
public Department SelectedDepartment 
{ 
    get 
     { return _selectedDepartment; } 
    set 
     { 
      _selectedDepartment = value; 
      OnPropertyChanged("SelectedDepartment"); 
     } 
} 

그런 다음

SelectedDepartment = Departsments.Where(department=> department.ID == Employee.Department.ID).First(); 
+0

+1 속성에 숨겨진 여분의 논리를 넣지 마십시오. – Aligned

2

당신은 간단하게 교체 할 수 있습니다

get 
    { return this.Employee.Department; }   **// where error occurs** 

아무것도를 선택하는 것이 훨씬 이해가되지 않습니다

get { return Employee == null? null: Employee.Department; }  

(원 사업자없이 같은 또는 적절한 나은 코드,)와 아직 아무 것도로드되지 않았을 때 콤보 박스가 나타나고 널에 바인딩하기 때문에 오류가 발생하지 않지만 Department를 null 참조에서 가져 오려고하기 때문에 오류가 발생합니다.

내부 viewmodel 생성자에서 물건을 가져 오겠다는 귀하의 결정에 대해 논할 수 있습니까? (내가 올바르게 이해한다면)하지만이 질문의 범위를 벗어난 것 같습니다.

관련 문제