XAMARIN - podwójna zmiana BindableProperty

XAMARIN - podwójna zmiana BindableProperty
JU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5046
0

Cześć, spotkałem się wczoraj z takim dość sporym problemem.

Mam zwykły ContentPage, na którym umieszczam ContentView w taki sposób:

Kopiuj
<StackLayout>
    <views:SheetHeader Sheet="{Binding ActiveSheet}" />
</StackLayout>

ViewModel mojego Page'a oczywiście posiada właściwość Sheet. Teraz w SheetHeader zrobiłem coś takiego:

Kopiuj
public Sheet Sheet
{
	get { return (Sheet)GetValue(SheetProperty); }
	set { SetValue(SheetProperty, value); }
}

public static readonly BindableProperty SheetProperty =
	BindableProperty.Create(nameof(Sheet), typeof(Sheet), typeof(SheetHeader),
		propertyChanged: OnSheetChanged);

private static void OnSheetChanged(BindableObject bindable, object oldValue, object newValue)
{
	SheetHeader obj = bindable as SheetHeader;
	Debug.Assert(obj != null);
	if (obj == null)
		return;

	obj.BindingContext = newValue;
}

I co się okazuje? OnSheetChanged wywyoływany jest dwa razy. Raz z poprawnymi danymi, a za drugim razem newValue ma wartość null. Czytałem, że niektórzy też mają taki problem, ale nie widziałem nigdzie rozwiązania. Czy ktoś się z tym spotkał i to ogarnął?

JU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5046
0

Po zagłębieniu się w temat, okazało się, że problemem jest zmiana BindingContextu:

Kopiuj
obj.BindingContext = newValue;

W moim przypadku zatem lepiej w XAMLu od razu wpisać BindingContext niż posługiwać się BindableProperty:

Kopiuj
<StackLayout>
    <views:SheetHeader BindingContext="{Binding ActiveSheet}" />
</StackLayout>

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.