Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

Von einer Page aus auf eine List<> in MainWindow zugreifen mittels Schnittstelle?
SharpLat
myCSharp.de - Member



Dabei seit:
Beiträge: 7

Themenstarter:

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

beantworten | zitieren | melden

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();
		}
	}
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16110

beantworten | zitieren | melden

Zitat von SharpLat
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.
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4136

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
SharpLat
myCSharp.de - Member



Dabei seit:
Beiträge: 7

Themenstarter:

beantworten | zitieren | melden

@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.
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16110

beantworten | zitieren | melden

Hab ich Dir beantwortet.
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
SharpLat
myCSharp.de - Member



Dabei seit:
Beiträge: 7

Themenstarter:

beantworten | zitieren | melden

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'?
       }
   }
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16110

beantworten | zitieren | melden

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
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers