2017-12-13 2 views
0

Ich habe eine Ansicht, die mit meinem Viewmodel verbindet. Immer wenn ein Benutzer das ausgewählte Element aus der Ansicht ändert, ergreife ich zusätzliche Daten, um sie an das ausgewählte Element anzuhängen. Wenn ich die Eigenschaft nach dem Aktualisieren des ausgewählten Elements nicht selbst erstelle, werden die Ergebnisse auf der Benutzeroberfläche nicht aktualisiert. Dies ist offensichtlich nicht die beabsichtigte Implementierung, aber vielleicht bin ich nicht sicher, wie die Immobilie benachrichtigt wird.WPF DataBinding erfordert manuelle Erhöhung

Hier ist die Backing-Eigenschaft, die an mehrere Steuerelemente bindet.

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

Hier ist die Combobox, die die Interaktion Trigger auf einen asynchronen Befehl in dem Ansichtsmodell bindet:

<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> 

Im Ansichtsmodell, das selectionchangedcommand ausführt meine asynchrone Funktion, um zusätzliche Daten, wenn der selectionchangedcommand gesetzt :

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

Verwenden Sie 'UpdateSourceTrigger = Explicit' – JohnyL

+0

Können Sie die Zeile im Code angeben, wo Sie" die Eigenschaft selbst erhöhen "? –

+3

@GregN Ihr Setter wird nicht aufgerufen und somit wird das Ereignis nicht ausgelöst. In Ihrem Befehl mutieren Sie nur 'SelectedData', die Sie nicht ersetzen. Wenn Sie es so implementiert haben, dann müssen Sie das Ereignis selbst auslösen, um die Bindung zu aktualisieren. – JSteward

Antwort

3

Aufgrund Sie nicht SelectedData Neuzuordnung wird die Steuerung nie über Änderungen erfahren.

Deshalb sollten Sie manuell das Ereignis selbst Sie irgendwo zB binden

im Fall erhöhen müssen. SelectedData.Attributes dann möglicherweise nicht INotifyPropertyChanged auf dem SelectedData korrekt implementiert.

+0

Es scheint, dass ich mein Modell (SelectedData) nicht vollständig durchsucht habe, obwohl mein notify-Property geändert wurde und daher keine Sicherung erfolgte. Das Modell wurde ordnungsgemäß implementiert, und jetzt funktioniert es, ohne die Eigenschaft manuell zu erhöhen. – GregN