Wie kann ich Rekursion vermeiden, wenn meine Ansichtsmodell Eigenschaften Aktualisierung?

StackOverflow https://stackoverflow.com/questions/1012812

  •  06-07-2019
  •  | 
  •  

Frage

In meiner Ansicht Ich habe einen Schieber und Combobox .

Wenn I ändern Sie den Regler , möchte ich die Combobox ändern.

Wenn I ändern Sie die Combobox , ich möchte den Schieberegler ändern.

Ich kann die eine oder andere udpate, aber wenn ich versuche, beide ich einen Stackoverflow-Fehler erhalten zu aktualisieren , da eine Eigenschaft hält die andere in einer Endlosschleife zu aktualisieren.

Ich habe versucht, in einem Neu berechnen () setzen, wo die Aktualisierung an einem Ort geschehen ist, aber immer noch in das Rekursion Problem führen.

Wie kann ich jede Kontrolle habe die andere zu aktualisieren, ohne in Rekursion?

in Aussicht:

<ComboBox 
    ItemsSource="{Binding Customers}"
    ItemTemplate="{StaticResource CustomerComboBoxTemplate}"
    Margin="20"
    HorizontalAlignment="Left"
    SelectedItem="{Binding SelectedCustomer, Mode=TwoWay}"/>


<Slider Minimum="0" 
        Maximum="{Binding HighestCustomerIndex, Mode=TwoWay}" 
        Value="{Binding SelectedCustomerIndex, Mode=TwoWay}"/>

in Ansichtsmodell:

#region ViewModelProperty: SelectedCustomer
private Customer _selectedCustomer;
public Customer SelectedCustomer
{
    get
    {
        return _selectedCustomer;
    }

    set
    {
        _selectedCustomer = value;
        OnPropertyChanged("SelectedCustomer");
        SelectedCustomerIndex = _customers.IndexOf(_selectedCustomer);
    }
}
#endregion

#region ViewModelProperty: SelectedCustomerIndex
private int _selectedCustomerIndex;
public int SelectedCustomerIndex
{
    get
    {
        return _selectedCustomerIndex;
    }

    set
    {
        _selectedCustomerIndex = value;
        OnPropertyChanged("SelectedCustomerIndex");
        SelectedCustomer = _customers[_selectedCustomerIndex];
    }
}
#endregion
War es hilfreich?

Lösung

versuchen, in den Set-Funktionen so etwas wie:

public int SelectedCustomerIndex
{
    get
    {
        return _selectedCustomerIndex;
    }

    set
    {
        if (value != _selectedCustomerIndex)
        {
         _selectedCustomerIndex = value;
         OnPropertyChanged("SelectedCustomerIndex");
         SelectedCustomer = _customers[_selectedCustomerIndex];
        }
    }
}

, um die Ereignisse zu feuern nur, wenn es eine tatsächliche Wertänderung ist. Auf diese Weise wird ein zweiter Anruf auf die eingestellte Eigenschaft mit dem gleichen Wert kein weiteres Änderungsereignis verursachen.

Sie müssen das auch natürlich für die andere Eigenschaft tun.

Andere Tipps

Beide Eigenschaften sind voneinander, daher die Rekursion genannt. Nicht im Zusammenhang überhaupt zu binden. Die richtige Weg ist, sich gegenseitig und Feuer-Änderungsbenachrichtigung für beide Eigenschaften zu ändern, wenn entweder Eigenschaftsänderungen:

    public Customer SelectedCustomer
    {
        get
        {
            return _selectedCustomerIndex;
        }

        set
        {
            _selectedCustomer = value;
            _selectedCustomerIndex = _customers.IndexOf(value);

            OnPropertyChanged("SelectedCustomer");
            OnPropertyChanged("SelectedCustomerIndex");
        }
    }

    public int SelectedCustomerIndex
    {
        get
        {
            return _selectedCustomerIndex;
        }

        set
        {
            _selectedCustomerIndex = value;
            _selectedCustomer = _customers[_selectedCustomerIndex];

            OnPropertyChanged("SelectedCustomer");
            OnPropertyChanged("SelectedCustomerIndex");
        }
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top