我遇到了奇怪的問題,我不明白。在主網頁我只有一個按鈕,導航到第二頁,並擁有我的模型:綁定和x:綁定雙向模式的問題
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));
}
在第二頁,只有組合框有兩個方式的SelectedIndex結合:
<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;
}
}
沒什麼特別的。問題是,我得到兩個不同的輸出,當我用Binding
和x:Bind
,但最糟糕的是,每一個新的導航到同一個頁面屬性的getter(和setter在x:Bind
)後調用更多次:
舊頁仍駐留在內存中,仍然訂閱屬性,這是可以理解的。如果我們從頁面返回後運行GC.Collect()
,我們將從頭開始。
但是,如果我們使用舊綁定與單向和選擇更改事件:
<ComboBox SelectedIndex="{Binding MyModel.Index, Mode=OneWay}" SelectionChanged="ComboBox_SelectionChanged">
隨着事件處理程序:
那麼它會工作 '正常' - 無論我們之前導航到頁面的次數多少,只有一個getter和setter。
所以我的主要問題是:
- 其中單向這種差異 - 雙向結合從何而來?
- 考慮到單向綁定大火只能吸氣一次 - 描述的行爲是雙向想要/打算嗎?
- 如何處理這個雙向綁定多個getter/setters被調用的情況下?
一個工作樣品,你可以download from here。
這是因爲你的靜態模型實例嗎?只是我的猜測。 –
@KiranPaul不,非靜態的行爲完全一樣。我幾乎可以肯定它與內存有某種聯繫 - 如果我在返回主頁後觸發'GC.Collect()',那麼我又回到了開始。儘管如此,我不知道爲什麼這兩個綁定差異如此之大,爲什麼單向getter總是被調用一次。 – Romasz