Ich habe seltsame Problem angetroffen, die ich nicht verstehen kann. In Haupt-Seite habe ich nur eine Taste, die zweite Seite navigiert und hält mein Modell:Binding und x: Bind Probleme mit TwoWay-Modus
public class Model : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void RaiseProperty(string property) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property));
private int index = 0;
public int Index
{
get { Debug.WriteLine($"Getting value {index}"); return index; }
set { Debug.WriteLine($"Setting value {value}"); index = value; RaiseProperty(nameof(Index)); }
}
}
public sealed partial class MainPage : Page
{
public static Model MyModel = new Model();
public MainPage()
{
this.InitializeComponent();
SystemNavigationManager.GetForCurrentView().AppViewBackButtonVisibility = AppViewBackButtonVisibility.Visible;
SystemNavigationManager.GetForCurrentView().BackRequested += (s, e) => { if (Frame.CanGoBack) { e.Handled = true; Frame.GoBack(); } };
}
private void Button_Click(object sender, RoutedEventArgs e) => Frame.Navigate(typeof(BlankPage));
}
Auf den zweiten Seite gibt es nur ComboBox, die in SelectedIndex Bindung Zweiweg hat:
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<ComboBox SelectedIndex="{x:Bind MyModel.Index, Mode=TwoWay}">
<x:String>First</x:String>
<x:String>Second</x:String>
<x:String>Third</x:String>
</ComboBox>
</Grid>
public sealed partial class BlankPage : Page
{
public Model MyModel => MainPage.MyModel;
public BlankPage()
{
this.InitializeComponent();
this.Unloaded += (s, e) => Debug.WriteLine("--- page unloaded ---");
DataContext = this;
}
}
Nichts Außergewöhnliches. Das Problem ist, dass ich zwei verschiedene Ausgänge, wenn ich Binding
verwenden und x:Bind
, aber das Schlimmste ist, dass nach jeder neuen Navigation auf dieselbe Seite der Unterkunft Getter (und Setter in x:Bind
) wird immer mehr mal genannt:
Die alte Seite befindet sich noch im Speicher und ist immer noch Eigentum, das ist verständlich. Wenn wir nach der Rückkehr von der Seite GC.Collect()
laufen, beginnen wir mit dem Start.
Aber wenn wir verwenden alte Bindung mit Einweg und Auswahl geänderte Ereignisse:
<ComboBox SelectedIndex="{Binding MyModel.Index, Mode=OneWay}" SelectionChanged="ComboBox_SelectionChanged">
zusammen mit dem Eventhandler:
private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (e.RemovedItems.Count > 0 && e.AddedItems.FirstOrDefault() != null)
MyModel.Index = (sender as ComboBox).Items.IndexOf(e.AddedItems.FirstOrDefault());
}
dann wird es 'richtig' arbeiten - nur ein Getter und Setter, egal wie oft wir vorher auf die Seite navigieren.
Also meine Hauptfragen sind:
- wo dieser Unterschied in Einweg-Zwei-Wege- Bindung kommt?
- unter Berücksichtigung, dass Einweg Bindung Feuer nur einmal Getter - ist das beschriebene Verhalten der Zweiweg- gewünschte/beabsichtigte?
- wie Sie mit dieser Zwei-Wege- Bindung im Falle mehrerer Getter/Setter bekommen angerufen werden?
Ein funktionierendes Beispiel können Sie download from here.
Liegt das an Ihrer statischen Modellinstanz? nur meine Vermutung. –
@KiranPaul Nein, mit nicht-statischen verhält es sich genau gleich. Ich bin mir fast sicher, dass es irgendwie mit dem Gedächtnis verbunden ist - wenn ich 'GC.Collect()' feuere, nachdem ich zur Hauptseite zurückgekehrt bin, bin ich wieder am Anfang. Trotzdem weiß ich nicht, warum diese beiden Bindungen so unterschiedlich sind und warum der Getter immer nur einmal aufgerufen wird. – Romasz