Wie kann ich Rekursion vermeiden, wenn meine Ansichtsmodell Eigenschaften Aktualisierung?
-
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
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");
}
}