2017-12-13 3 views
0

내 viewmodel에 연결하는보기가 있습니다. 사용자가 선택한 항목을보기에서 변경할 때마다 선택한 항목에 첨부 할 추가 데이터를 가져옵니다. 선택한 항목을 업데이트 한 후 속성 자체를 올리지 않으면 결과가 UI에서 업데이트되지 않습니다. 이것은 분명히 의도 된 구현이 아니지만 어쩌면 내가 속성이 어떻게 알려지는지에 대해 명확하지 않습니다.WPF 데이터 바인딩 필요 수동 레이즈

다음은 여러 컨트롤에 바인딩되는 배킹 속성입니다. 여기

public Break SelectedData 
{ 
    get { return _selectedData; } 
    set 
    { 
    if (_selectedData!= value && value != null) 
    { 
     _selectedData= value; 
     DeviceName = value.Feeder; 
     OnPropertyChanged("SelectedData");      
    } 
    } 
} 

는 뷰 모델에서 비동기 명령 작용 트리거 결합 콤보 경우 : selectionchangedcommand 설정할 때 뷰 모델에서

<ComboBox ItemsSource="{Binding Feeders}" DisplayMemberPath="OMSName" SelectedItem="{Binding SelectedData, Mode=TwoWay}" > 
    <i:Interaction.Triggers> 
    <i:EventTrigger EventName="SelectionChanged"> 
     <i:InvokeCommandAction Command="{Binding SelectionChangedCommand}" CommandParameter="{Binding SelectedItem}"/> 
    </i:EventTrigger> 
</i:Interaction.Triggers> 
</ComboBox> 

상기 selectionchangedcommand 추가 데이터를 추가하는 내 비동기 기능을 수행 :

SelectionChangedCommand = new RelayAsyncCommand(UpdateSelectedData); --In the constructor of the viewmodel 

public async void UpdateSelectedData() 
{ 
    try 
    { 
    await _breakRepo.GetEventData(SelectedData); 

    if (SelectedData.AttachedEvent.IsOpen) 
    { 
     SelectedData.Attributes= new EventAttributes 
     { 
     TotalAffected = SelectedData.AttachedEvent.Attributes.TotalAffected, 
     TotalRestored = SelectedData.AttachedEvent.Attributes.TotalRestored, 
     TotalOut = SelectedData.AttachedEvent.Attributes.TotalOut, 
     TotalCritical = SelectedData.AttachedEvent.Attributes.TotalCritical, 
     TotalMajor = SelectedData.AttachedEvent.Attributes.TotalMajor 
     }; 

     await _breakRepo.CallEventsAsync(SelectedData);     
    } 
    else 
    { 
     await _breakRepo.GetBreakByFeederAsync(SelectedData); 
    } 
    } 
    catch (Exception ex) 
    { 
    System.Windows.MessageBox.Show(ex.Message); 
    } 
    finally 
    { 
    //IF I ADD ONPROPERTYCHANGED("SelectedData") the other fields that bind 
    //to the values will update as expected 

    CurrentlySearching = true; 
    } 
} 
+0

Use'UpdateSourceTrigger = Explicit' – JohnyL

+0

코드에서 "속성 자체를 올리는"행을 나타낼 수 있습니까? –

+3

@GregN 세터가 호출되지 않아 이벤트가 발생하지 않습니다. 명령에서'SelectedData' 만 바꾸면 바꾸지 않습니다. 그런 식으로 구현 한 채로두면 바인딩을 업데이트하기 위해 이벤트를 직접 실행해야합니다. – JSteward

답변

3

SelectedData을 재 할당하지 않아서 컨트롤에서 변경 사항을 알 수 없습니다. 수동으로 자신이

경우에 당신은 예를 들어 어딘가에 바인딩 이벤트를 인상해야 할 이유

. SelectedData.AttributesSelectedDataINotifyPropertyChanged을 올바르게 구현하지 않았을 수 있습니다.

+0

notifypropertychanged를 사용하여 내 모델 (SelectedData)을 모두 터널링하지 않았으므로 다시 알리지 않았습니다. 모델을 올바르게 구현했으며 이제는 수동으로 속성을 올리지 않고도 작동합니다. – GregN