2016-11-29 2 views
-1

DataGrid에 기반한보기는 Appointment입니다. 사용자가 행을 두 번 클릭하면 클릭 한 약속을 보거나 편집 할 수있는 모델 창이 열립니다. 아래의 명령을 통해 LeftDoubleClick 마우스 이벤트에 바인딩됩니다. Y 인딩이 작동하고 명령이 올 Y 르게 호출됩니다.viewmodel 속성을 변경할 때 내보기가 업데이트되지 않는 이유는 무엇입니까?

_doubleClickCommand = new DelegateCommand<AppointmentRowViewModel>(async p => 
    { 
     if (BossViewModel.ShowModalCommand.CanExecute(null)) 
     { 
      var modal = new AppointmentFormWindow(); 
      await modal.ViewModel.Populate(p.Id, Cts.Token); 
      BossViewModel.ShowModalCommand.Execute(modal); 

     } 
    }, 
    p => true 
); 

선택된 항목 및 명령 파라미터 p는 속성 만 논리 제로로하는 AppointmentRowViewModel, AppointmentDto 객체 순수 표현 모델이다.

BossViewModelMainWindow의보기 모델로 어떤보기가 표시되는지 관리하며,이 경우에는 모달과 메시지 상자를 표시합니다. 나는 메시지 박스가 소유자 윈도우를 필요로하기 때문에 여기에 책임을 지웠다. 그리고 이것은 뷰를 알고있는 유일한 뷰 모델이다. MainWindowViewModel에서 다른 창을 열고 관리하는 것이 의미가 있습니다.

그래서 DoubleClickCommand은 열려고하는 창의 인스턴스를 만들고이 경우 해당 창에 대한 XAML은 AppointmentFormViewModel을 할당합니다.

public override async Task Populate(int? entityId = null, CancellationToken cancellation = new CancellationToken()) 
{ 
     if (entityId.HasValue) 
     { 
      await _apptService.Load(entityId.Value, this, cancellation); 
     } 
     IsInitialized = true; 
     OnAllPropertiesChanged(); 
} 

이 같은 INotifyPropertyChanged을 사용합니다 :

public event PropertyChangedEventHandler PropertyChanged; 
protected virtual void OnAllPropertiesChanged() 
{ 
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(string.Empty)); 
} 

그런 다음 BossViewModel.ShowModalCommand은 다음과 같습니다

_showModalCommand = new DelegateCommand<IModal>(async modal => 
    { 
     modal.ViewModel.BossViewModel = this; 
     modal.ShowDialog(); 
    }, 
    a => !ModalOpen 
); 
명령은 약속을로드하고 그 뷰 모델에 매핑하는 뷰 모델에 Populate를 호출

모든 것이 잘 작동하고 약속은 DB에서로드되고 이미에 할당 된 viewmodel에 매핑됩니다.. 모달이 열리지 만 해당 뷰 모델이 완전히 채워지고 양식 필드 중 viewmodel 속성 값을 반영하도록 업데이트되지 않습니다. 마치 새로운 약속을하는 것입니다.

내 모든 데이터 바인딩은 "모드 = 양방향 , NotifyOnSourceUpdated = 진정한 "를 사용, 그래서 뷰 ​​모델에 값을 설정 기대하고 PropertyChanged를 제기하면 뷰 요소를 업데이트 할 것입니다,하지만보기는 모두가 전혀 남아있다.

업데이트 : 다음은 비어있는 채로보기의 XAML 발췌입니다. 폼이 캡처에만 적합하기 때문에 바인딩 된 viewmodel 속성에는 모두 유효한 값이 있습니다. 해결

<Window.DataContext> 
    <vm:AppointmentFormViewModel /> 
</Window.DataContext> 
..... 
<TextBlock Text="Topic:" /> 
<TextBox Text="{Binding Topic, Mode=TwoWay}" /> 
<TextBlock Text="Venue: " /> 
<TextBox Text="{Binding Venue, Mode=TwoWay}" /> 
<TextBlock Text="Start Date: " /> 
<DatePicker SelectedDate="{Binding StartDate, Mode=TwoWay}" /> 
<ComboBox IsEditable="False" ItemsSource="{Binding TimeList}" SelectedItem="{Binding Path=StartTime, Mode=TwoWay}" /> 
<TextBlock Text="End Date: "/> 
<DatePicker SelectedDate="{Binding EndDate}" /> 
<ComboBox IsEditable="False" ItemsSource="{Binding Path=TimeList}" SelectedItem="{Binding Path=EndTime, Mode=TwoWay}" /> 
.... 
<DataGrid x:Name="TheList" Grid.Row="1" ItemsSource="{Binding Attendees}"....> 
    <DataGrid.Columns> 
     <DataGridTextColumn Binding="{Binding GivenName}" Header="Given Name" /> 
     <DataGridTextColumn Binding="{Binding FamilyName}" Header="Family Name" /> 
     <DataGridTextColumn Binding="{Binding Phone}" Header="Phone" /> 
     <DataGridTextColumn Binding="{Binding EMail}" Header="Email" /> 
     <DataGridTextColumn Binding="{Binding Position}" Header="Position" /> 
     <DataGridTextColumn Binding="{Binding OrgName}" Header="Org." /> 
     <DataGridTextColumn Binding="{Binding BranchName}" Header="Branch" /> 
    </DataGrid.Columns> 

문제 :는 갑자기 많은 코드 검사 후, 위의 코드 발췌, 일부 힘내 롤백에 대한 편집, 문제의보기는 제대로 웁니다. 나는 그것이 바인딩을 TwoWay으로 만들고 있다고 생각하지만, 내가 처음했을 때, 효과가 없었습니다. 뭔가 다른 점은, 아래의 의견에 답하면서 주변을 둘러 보면서, 어떻게 든 적절한 상태로 복원했기 때문입니다.

조언자와 도움을 주신 모든 분들께 감사드립니다.

+4

포스트 (의 일부), 및 오류를 바인딩 출력 창에 중요시 :

그래서, 대답은 뷰 모델 변경, 예를 들어, 양방향해야 할 때 업데이트하려는 바인딩입니다 . –

+3

UI 스레드에서 UI 알림 메서드를 호출하고 있는지 확인하십시오. 여기에는 비동기가 많이 발생하며 UI 스레드에서 실행되지 않으면 UI 변경 사항이 손실 될 수 있습니다. –

+1

또한 VS의 응용 프로그램 출력 창에 예외를 발생시키지 않는 바인딩 오류가 표시 될 수 있습니다. 유용한 정보 일 수 있습니다. –

답변

0

나는 단지이 질문을하기 전에 모든 바인딩을 TwoWay으로 만들었으며 그때까지는 뭔가 잘못되었다. 나는 뒤로 굴러, 성공한 그들 모두 TwoWay를 다시 만들었다.XAML

Text="{Binding Topic, Mode=TwoWay}" 
관련 문제