Laden...

Von einer Page aus auf eine List<> in MainWindow zugreifen mittels Schnittstelle?

Erstellt von SharpLat vor 4 Jahren Letzter Beitrag vor 4 Jahren 1.956 Views
S
SharpLat Themenstarter:in
7 Beiträge seit 2019
vor 4 Jahren
Von einer Page aus auf eine List<> in MainWindow zugreifen mittels Schnittstelle?

Hallo,
ich habe (zugegeben in XamarinForms) in meinem Code-behind des MainWindows eine List<> in der ab Start der App Objekte enthalten sind. Auf diese List<> möchte ich im Code-behind einer Page Zugriff haben, was aber nicht durch Vererbung möglich ist/gewollt ist, da die Code-behind der Page bereits von Page (bzw. ContentPage) erbt (und ich die Methoden aus dem MainWindow dort nicht brauche).

Habe versucht die Liste über eine Schnittstelle weiterzugeben, was aber nicht gelungen ist. Die Page über einen Konstruktor aufrufen und diesen überladen ist auch nicht möglich, da diese in einer TabbedPage-Struktur ist und ausschließlich über XAML verwaltet wird.

Über Tipps, wie ich Zugriff auf diese List erlange bzw. wie man eine dafür geeignete Schnittstelle schreiben muss, wäre ich sehr dankbar.

MainPage (MainWindow):


public partial class MainPage : Xamarin.Forms.TabbedPage
    {
        public List<Vokabel> Vokabeln;

        public MainPage(List<Vokabel> Voks)
        {
             Vokabeln = Voks;
        }
     }

Andere Page (Page1, ContentPage):


public partial class Page1 : ContentPage
	{
		public Page1 ()
		{
            InitializeComponent();
		}
	}

16.807 Beiträge seit 2008
vor 4 Jahren

Die Page über einen Konstruktor aufrufen und diesen überladen ist auch nicht möglich, da diese in einer TabbedPage-Struktur ist und ausschließlich über XAML verwaltet wird.

Dafür gibts Dependency Injection; und obendrauf ist dieser Fall ein Paradebeispiel für Reactive Extensions.

4.931 Beiträge seit 2008
vor 4 Jahren

Auch Xamarin.Forms unterstützt MVVM, s. Xamarin Forms: Model-View-ViewModel-Muster.
Du solltest also diese Vokabel-Liste ins ViewModel (bzw. ins Model) auslagern.

Daher siehe auch [Artikel] MVVM und DataBinding.

S
SharpLat Themenstarter:in
7 Beiträge seit 2019
vor 4 Jahren

@Th69
Hi, MVVM ist mir von WPF einigermaßen geläufig. Mir geht es eher darum, wie ich diese List in eine andere Klasse - egal welche - übertrage. Um die also ins Model auszulagern muss ich das erst wissen....
Diese kommt eigentlich aus dem Android-Project, weil dort die Daten mit SQLite eingelesen werden und ich gebe sie über App.xaml.cs an MainPage.xaml.cs weiter als Überladung in den Konstruktoren.

16.807 Beiträge seit 2008
vor 4 Jahren

Hab ich Dir beantwortet.

S
SharpLat Themenstarter:in
7 Beiträge seit 2019
vor 4 Jahren

Habe versucht die Methode für die Schnittstelle gleich in das Android Project zu packen. Ist es auch möglich nach dem Prinzip von Dependency Injection die Daten so in die "Empfängerklasse" Page3 zu bekommen? Wenn ja, kannst du bitte schreiben, wie das funktioniert @Abt? Stehe dezent auf der Leitung...


[Activity(Label = "Latein Lernen", Icon = "@drawable/icon", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
    public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity, IPassList
    {
        DbHelper db;
        SQLiteDatabase sqliteDB;
        List<Vokabel> Voks;

        protected override void OnCreate(Bundle savedInstanceState)
        {
            TabLayoutResource = Resource.Layout.Tabbar;
            ToolbarResource = Resource.Layout.Toolbar;

            Voks = new List<Vokabel>();
            db = new DbHelper(this);
            sqliteDB = db.WritableDatabase;

            base.OnCreate(savedInstanceState);
            global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
            LoadApplication(new App());
            Window.SetStatusBarColor(Android.Graphics.Color.Rgb(249, 148, 7));
        }

        public List<Vokabel> GetList()
        {
            ICursor selectData = sqliteDB.RawQuery("select * from Vocabulary", new string[] { });
                if (selectData.Count > 0)
                {
                    selectData.MoveToFirst();
                    do
                    {
                        Vokabel emp = new Vokabel()
                        {
                            Lektion = selectData.GetString(selectData.GetColumnIndex("Lektion")),
                            Indikator = selectData.GetString(selectData.GetColumnIndex("Indikator")),
                            LatVok = selectData.GetString(selectData.GetColumnIndex("Vokabel")),
                            Genus = selectData.GetString(selectData.GetColumnIndex("Lektion")),
                            Zusatz = selectData.GetString(selectData.GetColumnIndex("Zusatz")),
                            F1 = selectData.GetString(selectData.GetColumnIndex("F1")),
                            F2 = selectData.GetString(selectData.GetColumnIndex("F2")),
                            F3 = selectData.GetString(selectData.GetColumnIndex("F3")),
                            F4 = selectData.GetString(selectData.GetColumnIndex("F4")),
                            F5 = selectData.GetString(selectData.GetColumnIndex("F5")),
                            Ü1 = selectData.GetString(selectData.GetColumnIndex("Ü1")),
                            Ü2 = selectData.GetString(selectData.GetColumnIndex("Ü2")),
                            Ü3 = selectData.GetString(selectData.GetColumnIndex("Ü3")),
                            Ü4 = selectData.GetString(selectData.GetColumnIndex("Ü4")),
                            Ü5 = selectData.GetString(selectData.GetColumnIndex("Ü5")),
                        };
                        Voks.Add(emp);
                    }
                    while (selectData.MoveToNext());
                }

            return Voks;
        }
    }


public interface IPassList
    {
        public List<Vokabel> GetList();
    }


public class Page3 : ContentPage
   {
       public List<Vokabel> Vokabeln;
       public Page3()
       {
            InitializeComponent();
            //Daten aus Methode in IPassList in Vokabeln bekommen mit Instanz 'IPassList pass'?
       }
   }

16.807 Beiträge seit 2008
vor 4 Jahren

Keine Ahnung, wie das in Xamarin Android funktioniert; in Xamarin Forms funktionierts wie in jeder anderen .NET Applikation.
Aber Dependency Injection ist so ein Basic-Ding heutzutage, dass Du hunderte wenn nicht tausende Treffer dazu findest, zB
Dependency Injection Containers in Android – Xamarin