Laden...
G
Gepro myCSharp.de - Member
IT-Fachinformatiker NRW Dabei seit 18.04.2007 419 Beiträge
Benutzerbeschreibung

Forenbeiträge von Gepro Ingesamt 419 Beiträge

20.12.2011 - 00:31 Uhr

Jetzt verstehe ich.
Ich muss den Key "SQL Server Compact Edition Database File" nehmen, der als Wert bei standard unter dem Schlüssel .sdf angegeben ist.
Jetzt klappts, danke!

19.12.2011 - 23:12 Uhr

sondern unterhalb des Knotens, auf den er in seinem default Eintrag verweist...

Wie "verweise ich einen default Eintrag" ? Das versteh ich nicht.
Also ich mach den shell-Schlüssel z.B. unter den neuen Schlüssel Test.sdf und dann ?

19.12.2011 - 19:03 Uhr

Hi,
ich möchte gerne das Kontextmenü erweitern, wenn ich auf eine .sdf-Datenbankdatei rechts klicke.

Ich habe aktuell folgenden Quellcode


        public static void Create()
        {
            string keyName = ".sdf";
            string contextName = "Das ist ein SDF Test";
            string exe = @"C:\Users\........exe";

            bool isWritable = true;

            try
            {
                RegistryKey classesRoot = Registry.ClassesRoot;
                RegistryKey parentKey = classesRoot.OpenSubKey(keyName, isWritable);

                parentKey.CreateSubKey("shell");

                RegistryKey shell = parentKey.OpenSubKey("shell", isWritable);
                RegistryKey context = shell.CreateSubKey(contextName);
                RegistryKey command = context.CreateSubKey("command");
                command.SetValue("", exe);
                classesRoot.Flush();
                classesRoot.Close();
            }
            catch (Exception)
            {
                throw;
            }
        }

Wenn ich jetzt das Kontextmenü aufrufe sehe ich nichts. Was mache ich falsch ?

28.12.2010 - 16:11 Uhr

OK, und wie sage ich meiner Software sie soll ein bestimmtes Interface verwenden ?

28.12.2010 - 12:05 Uhr

Hallo,
mit welchen Klassen muss ich arbeiten, wenn ich eine Liste von verfügbaren Internetverbidungen angezeigt bekommen möchte ? (WLAN, UMTS Stick usw...)
Am besten noch dazu: Momentan verbunden mit: so und so

20.12.2010 - 20:13 Uhr

Stimmt, das sollte man negieren, war aber nur ein Beispielcode. Ich habe keine News-Klasse bzw. Reader. Das war nur um die Frage zu veranschaulichen.

Ok, danke für eure Informationen. Anscheind sollte so eine Klasse nur als Datenstruktur dienen und nicht wirklich Logik beinhalten.

19.12.2010 - 15:15 Uhr

Moin,
Ich habe oft das Problem, die Verantwortlichkeiten in meinen Klassen zu erkennen.
Und vor allem: Spricht man schon von einer Verantwortlichkeit, wenn ich eine Methode in meine Klasse habe, die nur wiederum eine andere Methode von einem Objekt einer anderen Klasse aufruft und ich in meiner eigenen Klasse nicht die
Logik implementiert habe? (später bei DownloadDescription als Beispiel)

Ich habe z.B. eine Klasse: News


    public class News
    {
        public News(Uri page)
        {
            this.Page = page;
            this.Title = "Kein Titel vorhanden";
            this.ShortDescription = "Keine Beschreibung vorhanden";
        }

        public Uri Page { get; set; }
        public string Title { get; set; }
        public string ShortDescription { get; set; }
    }

Diese Klasse hat erstmal kein Verhalten, ist nur da um Daten zu einer

Nachricht,
die aus dem Web kommt, zu speichern.

Wenn ich jetzt diese Nachricht im Browser anzeigen möchte, könnte ich
folgende Methode schreiben:


        public void OpenInBrowser()
        {
            try
            {
                Process.Start(this.Page.AbsolutePath);
            }
            catch (Exception)
            { }
        }

Die Nachrichten-Klasse beinhaltet jetzt die Daten und kann die Nachricht im Browser öffnen...
2 Gründe zur Änderung (2 Verantwortlichkeiten) ??

Oder Wenn ich folgende Methode habe:


    public class News
    {
        private DescriptionDownloader descDownloader;

        public News(Uri page)
	{
	// usw...


        public void DownloadDescription()
        {
            if (this.descDownloader == null)
            {
                this.descDownloader = new DescriptionDownloader();
            }
            string desc = this.descDownloader.GetDownloadedDescription();
            if (string.IsNullOrEmpty(desc))
            {
                this.ShortDescription = desc;
            }
        }

Jetzt würde man auf jedenfall davon sprechen, das die Klasse mehr als eine
Verantwortlichkeit oder ?

Wichtigste Frage vllt:
Oder WÄRE NUR DIE IMPLEMENTIERUNG der "DownloadDescription-Logik" als weitere
Verantwortlichkeit zu bewerten und NICHT ALLEIN DER AUFRUF der Methode aus der DescriptionDownloader-Klasse, wie in dieser Methode???

10.11.2010 - 09:54 Uhr

Also ein Ja oder Nein hätte mir schon gereicht 😉
Das ist nur ein Beispiel, den ich hier per Webseite eingetippt habe. Also ich habe keine Game oder Logger Klasse in einem meiner Projekte.

Kann man nicht allgemein sagen, Beispiel 2 wäre in Bezug auf hohe Kohäsion "erlaubt" und Beispiel 1 nicht ?

10.11.2010 - 09:20 Uhr

Hi,
Die Fassade bietet eine einheitliche Schnittstelle für mehrere andere Komponenten (Subsystem), wie in meinem Beispiel der Logger.
Also ist doch nur mein Beispiel 2 "korrekt" ??

10.11.2010 - 08:07 Uhr

Man sagt ja, das eine Klasse nur eine Verantwortlichkeit haben soll und keine mehr
Also eine hohe Kohäsion (Zumindestens spricht man dann von einem guten OO-Design).
Jetzt die Frage:
Heißt das, dass ich die Implementierung einiger Funktionen nur nicht in einer Klasse gemeinsam unterbringen darf ? oder sie nicht mals von einer anderen Klasse aufrufen ?
Ist schwer zu formulieren, ich hab da mal ein Beispiel...

Beispiel 1:


public class Game
{
    public void Play()
   {
      // Quellcode
   }
    public void Stop()
   {
      // Quellcode
   }
    public void Login()
   {
      // Quellcode
   }
    public void Logout()
   {
      // Quellcode
   }
}

Hier wird die Login/Logout Implementierung direkt in der Game Klasse geschrieben, dieses ist ja nicht zu gruppieren mit dem Play() und Stop(), also eine andere Verantwortlichkeit. Das soll man ja vermeiden.

Ist folgendes allerdings, in Bezug auf ein gutes Entwurfsdesgin, erlaubt ?

Beispiel 2:


public class Logger
{
    public void Login()
   {
      // Quellcode
   }
    public void Logout()
   {
      // Quellcode
   }
}


public class Game
{
    private Logger logger = new Logger();

    public void Play()
   {
      // Quellcode
   }
    public void Stop()
   {
      // Quellcode
   }
    public void Login()
   {
      this.logger.Login();
   }
    public void Logout()
   {
      this.logger.Logout;
   }
}

Hier wird die Implementierung bzw. die Verantwortung in der Logger Klasse ausgelagert, aber trotzdem durch die Klasse Game aufgerufen.

Hat die Game Klasse also weiterhin nur eine Verantwortlichkeit bzw. eine hohe Kohäsion oder eine geringe ?

16.09.2010 - 12:15 Uhr

Ja das stimmt schon, dass das VM nicht die View kennen soll...aber...
Ich habe ein ResourceDictionary, indem sich das gvStockVehicles:GridView befindet.
Ich müsste dieses ja dann im VM erzeugen und dann an die View anbinden, das ist doch noch "schlimmer"...
Also wie gesagt, ich muss unbedingt in dem VM auf die GridViewColumns zugreifen können, da ich verschiedene Ansichten als .xml-Datei abspeicher und demnach die Columns vom Index und der Breite dynamisch ändern muss. Ich würde ja Templates für die Columns bzw. das GridView verwenden, aber wie soll ich diese abspeichern können und in die View laden??

@edit: Also der Benutzer kann im Programm die Einstellungen der Columns ändern

16.09.2010 - 12:14 Uhr

Wenn ich Eigenschaften eines ViewModels an die View binde, habe ich ja z.B. public int Bla {get;set;}
Das Problem ist, da Eigenschaften natürlich öffentlich sind, kann ich auch von ausser auf die Eigenschaften des ViewModel zugreifen. Das möchte ich allerdings nicht, da im Getter meistens "einmalig" Schleifen oder sonstiges durchlaufen wird, wenn die View auf den Getter einer Eigenschaft beim initialisieren zugreift.
Meine Frage also, wie binde ich Variablen vom ViewModel an die View, ohne in der Geschäftslogik auf diese Variablen des ViewModels zugreifen zu können ? Geht dies überhaupt ?

16.09.2010 - 10:59 Uhr

Moin,
Ich arbeite mit MVVM und habe ein ViewModel an das DataContext eines Fensters gebunden...
Ich habe im VM eine Eigenschaft: OverviewGridview, diese möchte ich an die GridView meiner ListView auf dem Fenster binden. Ich möchte aber nur die GridView von der ListView erhalten und nicht anders herum, also nur Mode=OneWayToSource.

In meinem Beispiel wird anscheind aber erst der Style gesetzt und gibt mir als GridView null zurück und wohl nachher erst die Resource an die GridView gebunden...

Wie erhalte ich jetzt in meinem VM die GridView des ListView ?


        private GridView gv = null;

        public GridView OverviewGridview
        {
            get { return this.gv; }
            set
            {
                if (this.gv != value)
                {
                    this.gv = value;
                }
            }
        }


                    <ListView 
                        DockPanel.Dock="Bottom"
                        Margin="0,-24,0,0"
                        View="{StaticResource gvStockVehicles}"
                        ItemsSource="{Binding VehicleCollectionView}">
                        <ListView.Style>
                            <Style TargetType="ListView">
                                <Setter Property="View" Value="{Binding OverviewGridview, Mode=OneWayToSource}" />
                            </Style>
                        </ListView.Style>
                    </ListView>

14.09.2010 - 10:00 Uhr

[WPF, xaml]

Hallo,
Ich habe ein Icon (*.ico) in dem sich ein Bild mit 16x16, 32x32 und 48x48 befindet.
Ich binde dieses Icon jetzt als ImageSource an ein ImageBrush, welches als Background von einem UserControl gezeichnet wird.
Welche Größe vom Icon nimmt er sich jetzt, wenn ich z.B. das UserControl 16x16 groß setze oder z.B. 20x20 ???

11.09.2010 - 11:35 Uhr

Ok, vielleicht habe ich das mit den Spielern falsch gesehen,
Warscheinlich ist Spieler nicht Teil vom Verein in Bezug auf eine Aggregation...
vielleicht muss ich es so sehen:
Klasse "Team" (Unter anderem kapselt es eine Liste mit Spielern) ist Teil vom Verein und muss eine Komposition sein, weil wenn es den Verein nicht mehr gibt, gibt es auch das Team als solches nicht mehr... Und Spieler ist dann Teil vom Team, aber nicht zu sehr abhängig vom Team und somit eine Aggregation...
Sehe ich das jetzt richtig ?

10.09.2010 - 19:15 Uhr

Aha, danke, das ergibt Sinn;)

Allgemein gibt es keine Regel oder Richtlinie, die besagt, wie Kompositionen implementiert werden ?
Aber diese Schreibweise find ich sehr gut, mit den Schnittstellen.

Natürlich möchte ich auch noch gerne die 2. Frage beantwortet haben, aber mir kommt schon wieder eine neue in den Sinn:
Ich habe FootballClub und Player, ist Player "Teil" vom "Ganzen" FootballClub ?? Ein Verein kann ja ohne Fußballspieler eigendlich nicht "existieren", also Aggregation oder Assotiation ?

@edit:
Wobei, es ist immer noch möglich auf das Stadium Objekt zuzugreifen:


    public class EntityBase
    {
        public string Name { get; set; }
    }

    public interface IStadium
    {
        string Name { get;}
        int Capacity { get; }
    }

    public class Stadium : EntityBase, IStadium
    {
        public Stadium()
        {
            this.Name = "Stadion1";
            this.Capacity = 50000;
            this.Terraces = 30000;
            this.Seats = 20000;
        }

        public int Terraces { get; set; }

        public int Seats { get; set; }

        #region IStadium Members

        public int Capacity { get; set; }

        #endregion
    }

    public class Club : EntityBase
    {
        private Stadium stadium;

        public Club()
        {
            this.Name = "";
            this.stadium = new Stadium();
            this.Established = DateTime.Today;
        }

        public DateTime Established { get; set; }

        public IStadium Stadium
        {
            get { return this.stadium; }
        }

    }

public void DoTest()
{
            Club club = new Club();
            IStadium stadiumData = club.Stadium;
            club = null; // <- Ab hier, dürfte auch eig. kein Stadium Zugriff mehr Möglich sein

            Stadium cs = (Stadium)stadiumData; //<- da ist das Problem
            int terraces = cs.Terraces;
}

10.09.2010 - 16:17 Uhr

Nochmal auf das Thema zurück zu kommen,
Ich habe eine Komposition, z.B. FootballClub (Ganz) und Stadium (Teil) <-- gehen wir jetzt mal davon aus, das hier die Komposition definitiv richtig wär
Wenn ich jetzt eine Referenz vom Stadium in die FootballClub Klasse aufbewahren möchte, darf dies nicht als Eigenschaft geschehen oder ?
Wenn Stadium eine Eigenschaft und somit öffentlich von FootballClub wär, könnte man von außen darauf referenzieren und somit, wenn das Objekt
von FootballClub gelöscht wird, hätte man noch eine Referenz vom Stadium über (und bei der Komposition ist ein "Teil" vom Lebenszyclus des "Ganzen" abhängig)
Wenn man allerdings von Außen Informationen vom Stadium erhalten möchte, müsste man ja, wenn die Stadium nicht als Eigenschaft festgelegt wird, sondern nur als private Variable,
ganz viele Getter Methoden schreiben, die alle Möglichen und wichtigen Informationen bzw. Eigenschaften von Stadium aus dem FootballClub Objekt zurückgeben,
das kanns doch auch nicht sein... ??

und 2. gibts einen programmiertechnischen Unterschied zwischen Aggregationen und Assoziationen ?? Wie z.B. bei meiner Kompositionen von der Art her?

31.08.2010 - 16:40 Uhr

Spieler1(Objekt) ist Mitglied in(Assoziation) Team(Objekt z.B. List<Spieler>).

Würde man hier nicht sagen, dass Spieler ein und Team als Beziehung eine Aggregation haben ?
Spieler:Teil, Team:Ganz ?

Das mit den Spielern war ja auch ein Beispiel: Meine Hauptfrage ist ja, ob es bestimmte "Implementier-Richtlinien" gibt, für die jweiligen Beziehungsarten, um einfacher dieses Klassendiagramm umsetzen zu können

31.08.2010 - 15:47 Uhr

Moin,
eine Frage, die mir schon die ganze Zeit auf der Seele liegt.
Wenn ich ein Klassendiagramm anlege und Beziehungen der einzelnen Klassen untereinander mit Kompositionen, Aggregationen und Assoziationen plane, stellt sich mir auch die Frage, wie ich diese später programmiertechnisch umsetze.

Gibt es "Richtlinien" wie man diese Benziehungen später umsetzt ?

Z.B.
Kompositionen:
Ich habe eine Klasse FootballClub und eine Klasse Stadium,
Hier habe ich eine Ganz-Teil Beziehung, Club ist Ganz und Stadium Teil und in diesem Fall eine Komposition; Wenn der Club weg ist, also nicht mehr existiert, dann existiert Stadium quasi auch nicht mehr.
-> Stadium ist eine Eigenschaft von Club und diese Referenz taucht nur in diesem Club auf

Aggregationen:
Wenn ich jetzt eine Klasse FootballClub und FootballPlayer habe, liegt auch hier eine Ganz-Teil Beziehung vor. Nur keine Komposition. Wenn der Club sich auflöst oder der Spieler wechselt, kann er immernoch bei einem anderen Club spielen oder sogar in der Nationalmanschaft.
-> Player sind als Liste eine Eigenschaft von Club, können aber in mehreren Objekten bzw. Klassen vorkommen

Assoziationen:
Ich habe eine Klasse Transfermarket und FootballPlayer, auf dem Transfermarkt befinden sich kurzfirstig die Player. Diese Player werden vllt. per Methode als Parameter übergeben, sind aber keine Eigenschaft von Transfermarket
-> Vllt. Methode: Transfermarket.DoTransfer(FootballPlayer playerIn);

Werden diese Beziehungensarten programmiertechisch so umgesetzt wie ich es bei den Pfeilen geschildert habe ? Oder wie plane ich diese Beziehungen und was bringen sie mir für die Programmierung, wenn es dort keine "Beziehungs-Implementierungs-Richtlinien" gibt??

24.08.2010 - 14:09 Uhr

Hi,
ich habe mal eine Frage zum Stil bzw. zu meiner Denkweise.
Folgendes...

Ich habe diese Klassen:
*EntityBase (Oberklasse)
*Nation
*Association
*Club
*League
*Player
*Stadium

Alle Klassen bekommen eine Id:Guid und Name:string von EntityBase geerbt. Zu allen Objekten der jeweiligen Klassen soll ein Bild angezeigt werden.
Jetzt könnte ich in EntityBase z.B. ImageFile:string implementieren, damit alle Klassen durch die Generalisierung die Eigenschaft ImageFile besitzen.

Der Name der Eigenschaft "ImageFile" gefällt mir aber nicht so sehr z.B. bei Nation, da würde ich gerne das Bild mit "Flag" bezeichnen oder bei Player mit "Photo" oder bei Club mit "Emblem", trotzdem möchte ich diesen String aber in EntityBase implementieren...
Vllt möchte ich später mal alle Bilder von einer Klasse verwalten lassen und somit müsste ich nur EntityBase-Objekte übergeben, die mir das Leben einfacher machen würden...

Wie würdet ihr dabei vorhehen ??
ImageFile:string in EntityBase implementieren und in den jeweiligen Unterklassen mit:


public string Photo // ImageFile ist trotzdem in der Klasse "über" also nicht schön...
{
   get { return base.ImageFile; }
   set { base.ImageFile = value; }
}

überschreiben ?
Oder würdet ihr in meinem Beispiel auf das Implementieren von ImageFile:string in EntityBase verzichten ??

Ist wohl eine Stil-Frage, aber was sind eure Meinungen dazu?

16.06.2010 - 15:57 Uhr

Stimmt, am PopUp habe ich gar nicht gedacht.
Danke

16.06.2010 - 10:14 Uhr

Moin,
gibt es die Möglichkeit, dass man ListBoxItems auch außerhalb der ListBox anzeigt, wenn die ListViewItems größer sind als die ListBox ?
Also in meiner ListBox befinden sich 4 Items, alle halb so hoch wie die ListBox, beim MouseOver soll das jeweilige Item aber viel größer werden und auch außerhalb der ListBox angezeigt werden und nicht abgeschnitten (einen adorner will ich dafür nicht nehmen) weil meine anderen ListBoxItems sollen sich dann zur seite bewegen und "Platz machen"...
geht so etwas? und wie?

26.05.2010 - 15:29 Uhr

Leider hat das nicht funktioniert

25.05.2010 - 22:08 Uhr

Moin,
Wenn ich meine ListCollectionView an die ItemsSource einer ListView binde, selektiert er mir automatisch beim anzeigen der Items das erste Item aus und schmeißt das CurrentChanged Event.

Wie kann ich verhindern, das ein Item automatisch ausgewählt werden ?

24.05.2010 - 18:22 Uhr

Hi,
Mich interessiert die ganze Zeit schon, was man bei MVVM genau als Geschäftslogik und was genau als Model bezeichnet.
Bis jetzt habe ich z.B. meine Klassen immer nach einem VIEWMODEL Ordner bzw. einen VIEW Ordner gegliedert.
Wie siehts aber bei den Models aus?
Was ist genau ein Model, nur Entities ? oder auch DAL-Klassen oder Repository-Klassen ?
Oder ist der Oberbegriff dafür Geschäftslogik und die Entities sind quasi die Models ?

Meine aktuelle Struktur (VS2010 in Ordnern/Namespaces einteteil)

MODEL (Datenbankzugriffsklassen, Entities, Suchfunktionen-Klassen usw.)
DAL
Entity
Repository

VIEWMODEL

VIEW (Windows, UserControls, RessourceDictionaries)
Styles
Templates

Was ist hier von Geschäftslogik ? Alles in Model ?
oder ist in der Logik ein Fehler ?

14.05.2010 - 16:08 Uhr

Ich habe keine Fremdschlüssel-Beziehungen angegeben,
klar benutzte ich die 2 IDs dafür (GUID) aber das weiß die Datenbank ja nicht.
Es muss ein anderer Grund sein...

14.05.2010 - 09:43 Uhr

Moin,
Ich habe mich mit einem DataContext per Mapping mit meiner SqlCeDatenbank (sdf) verbunden.
Ich habe mehrere Tabellen und per Optionen sollen alle Datensätze gelöscht werden.
Bei Tabelle2 - Pseudo natürlich;) - braucht er 45 Sekunden (ca. 600.000 Datensätze)
und bei den anderen unter 1 Sekunde, wobei auch Tabellen dabei sind die ca. 300.000 Datensätze beinhaltet.

Welche Gründe kann es geben, das genau diese eine Tabelle sooo lange braucht ??
(Andere Tabellen haben auch mehrere Spalten)

Tabelle2:
GUID (uniqueidentifier) Spalte1
GUID (uniqueidentifier) Spalte2
GUID (uniqueidentifier) Spalte3
DateTime (date) Spalte4
int (int) Spalte5

Lösch-Logik


            List<string> sqlCeCommandStrings = new List<string>(new string[]
                {
                delTabelle1, // DELETE FROM 'Tabellenname'
                delTabelle2,
                delTabelle3,
                delTabelle4,
                delTabelle5,
                delTabelle6,
                delTabelle7,
                delTabelle8,
                delTabelle9
                });

            int errorCount = 0;

            System.Diagnostics.Stopwatch t = new System.Diagnostics.Stopwatch();

            // Befehle ausführen
            foreach (var cmdString in sqlCeCommandStrings)
            {
                SqlCeCommand cmd = new SqlCeCommand(cmdString, base.connection);
                t.Start();
                cmd.ExecuteNonQuery();
                t.Stop();
                t.Reset();
            }

28.04.2010 - 10:18 Uhr

Und wie sieht das dann im ganzen nachher aus ? (Wenn man von Anfang an mit mehreren Projekten arbeitet)
Alle Klassen befinden sich in Klassenbibliotheken und in meinem Hauptprojekt ist später
nur die MainWindow und MainWindowViewModel ?

28.04.2010 - 09:46 Uhr

Mein Hauptprojekt, von dem ich mehrere Klassen in meinen Klassenbibliotheken brauche, besteht ja aus eine exe und nicht aus eine dll. Wie soll ich auf die Klassen des Hauptprojekts in den Klassenbibliotheken zugreifen =?

28.04.2010 - 09:29 Uhr

mit dll-Projekt meine ich eine Klassenbibliothek in der gleichen Projektmappe, wo sich auch das Hauptprojekt befindet.
Das Problem ist, dass erst das Hauptprojekt existierte und nun so viele Komponenten hinzukommen, dass ich erst eine bessere Gliederung durch weitere Klassenbibliotheken für sinnvoll hielt.
Also wärs wohl besser doch wieder alles ins Hauptprojekt zu "verschieben" ?

28.04.2010 - 09:21 Uhr

Hallo,
Ich habe eine Projektmappe mit VS 2008 angelegt und 3 (Unter)Projekte in dieser Projektmappe. Eine Projekt ist das Hauptprojekt und die anderen 2 sollen als Klassenbibliothek per dll in das Hauptprojekt eingebunden werden.
Jetzt benötige ich aber in einem "dll-Projekt" ein paar Klassen aus meinem Hauptprojekt.
Wie gehe ich dabei jetzt am Besten vor ?
Ich habe ja keine Dll vom Hauptprojekt, stehe gerade ein bisschen auf dem Schlauch. Die Klassen die ich benötige möchte ich ja nicht doppelt haben...

Zur Information:
Framework 3.5 Sp1
Sprache: C# mit WPF (MVVM)

27.04.2010 - 10:20 Uhr

Hallo,
Ich wollte euch alle mal fragen, wie ihr euer Projekt im Visual Studio so aufbaut bzw. strukturiert?
Mir geht es vor allem um WPF mit MVVM.

Welche Ordner legt ihr an und welche Namen erhalten Sie, sprich Namespaces ?
Wie bezeichnet ihr eure Klassen, welche Wrapper-Klassen nutzt ihr ?

Mir geht es darum, auch mal andere Ansichten zu sammeln um vllt. meine Strukturierungen optimieren zu können.
Bei MVVM erstellen manche ein Model, ViewModel und View Ordner. Das ViewModel bekommt den Namen am Ende der Klassenbezeichnung
zB. [MainWindow]ViewModel. Ich lege das ViewModel und die View lieber in einem Ordner an, so kann man die ViewModels schneller den jeweiligen Views zuordnen
ORDNER: VIEW
Klassen:
MainWindow.xaml
MainWindowViewModel
usw...

Meine Struktur sieht wie folgt aus:

Projekt

Ordner: _Files (Textdateien, UML-Diagramme, TODO usw.)
Ordner: Model (Geschäftslogik und Unterordner)
Unterordner von Model: Entity (Alle Objekte, von denen ich im Projekt mehrere Instanzen habe und in einer Datenbank speicher)
Unterordner von Model: Repository (Beinhaltet Listen mit Entities und ist von ObservableCollection<T> abgeleitet)
Unterordner von Model: DAL - DataAccessLayer) Klasse, die auf eine Datenbank zugreift, z.B. von DataContext abgeleitet bei LINQ To SQL
Ordner: View (View und ViewModels)

Manche erstellen ja mehrere Projekte in der Projektmappe um Komponententests schneller und entkoppel durchführen zu können.
Bei MVVM habe ich auch schon Projektmappen gesehen mit 3 Projekten: Model, ViewModel und View. Mir persönlich gefällt das aber nicht so sehr.

Wie sieht eure Gliederung aus?
Ideen und Anregungen 😉

23.03.2010 - 09:27 Uhr

Es wird kein Trennzeichen (Punkt) nach 2 Stellen angezeigt.
Also wenn ich eintippe 12 soll nichts passieren, wenn ich dann aber die 3te Zahl eintippe 123 soll automatisch so der Text formatiert werden: 1.23
Und das passiert nicht, es wird nie ein Trennzeichen angezeigt.
Wie bekomme ich das hin?

22.03.2010 - 17:24 Uhr

Moin,
Ich habe eine TextBox


 <TextBox Text="{Binding ProductVersion, StringFormat={}{0:F2}}" Height="23" Width="114" />

Binding


public string ProductVersion { get; set; } // Im ViewModel

Wenn die Produktversion eingetippt wird, sollen automatisch immer 2 Nachkommastellen angezeigt werden, egal wie viele Nummern eingegeben werden.

Liegt der Fehler darin, dass ich mit einem String binde ? oder ist das Format falsch ?

04.03.2010 - 21:02 Uhr

Hi, Danke es funktioniert damit.

03.03.2010 - 10:50 Uhr

Den Thread hatte ich mir schon vor ein paar Tagen durchgelesne, hat allerdings nicht funktioniert.

  
bmi.Freeze();  
  
ImageControl.Dispatcher.BeginInvoke(DispatcherPriority.Normal, (ThreadStart)delegate { ImageControl.Source = bmi; });  
  

beim Freeze() gibt es ne Exception und wenn ich Freeze auskommentierte sagt er mir, das er nicht auf bmi zugreifen kann, weil dieses Objekt einen anderen Thread gehört.

03.03.2010 - 10:11 Uhr

Datenbanksystem: MSSQL (SqlCe)

Moin,
Ich habe eine Datenbank per Code angelegt mit MSSQL.
Dieser Datenbank möchte ich nachträglich ein Passwort zuweisen.

Beim Anlegen einer neuen DB habe ich das hier gefunden:
CREATE DATABASE "secure.sdf"
DATABASEPASSWORD '<enterStrongPasswordHere>'

Bringt mir aber nichts, die DB ist schon da, wie kann ich jetzt das Passwort einer bestehenden DB setzen ?
Warscheinlich muss man altes Passwort angeben und dann neues, habe aber nix auf Anhieb im Web gefunden...

03.03.2010 - 10:01 Uhr

Gleiche wie vorher...


        public static readonly DependencyProperty LoadedImagesProperty =
            DependencyProperty.Register("LoadedImages", typeof(ObservableCollection<Image>), typeof(ImagePreviewScroller), new UIPropertyMetadata(new ObservableCollection<Image>()));

        public ImagePreviewScroller()
        {
            InitializeComponent();
            this.ImageSources = new List<string>();
            this.Loaded += new RoutedEventHandler(ImagePreviewScroller_Loaded);
        }

        public ObservableCollection<Image> LoadedImages
        {
            get { return (ObservableCollection<Image>)GetValue(LoadedImagesProperty); }
            protected set { SetValue(LoadedImagesProperty, value); }
        }

        public List<string> ImageSources { get; set; } // Urls der Bilder

        void ImagePreviewScroller_Loaded(object sender, RoutedEventArgs e)
        {
            List<Image> images = new List<Image>();
            foreach (var imgSource in this.ImageSources)
            {
                Image img = new Image();
                img.Source = new BitmapImage(new Uri(imgSource, UriKind.Absolute));
                LoadedImages.Add(img); // Hier hängt die Oberfläche
            }


        <DataTemplate x:Key="itemTemplate">
            <Border
                Name="borderRoot"
                CornerRadius="3"
                Margin="2,2,2,4"
                BorderThickness="2">
                <ContentControl Content="{Binding IsAsync=True}"  /> // Bringt auch nix
            </Border>


        <ListBox
            BorderThickness="0"
            Margin="10"
            ItemTemplate="{StaticResource itemTemplate}"
            ItemsSource="{Binding LoadedImages, ElementName=imgScroller, IsAsync=True}"
            ItemsPanel="{StaticResource itemsPanel}"
            ScrollViewer.HorizontalScrollBarVisibility="Auto"
            ScrollViewer.VerticalScrollBarVisibility="Disabled"/>

02.03.2010 - 11:06 Uhr

Ich habe eine MainWindow und dadrin befindet sich ein Grid mit einer ListView und einigen anderen Controls.
Da ich auf der MainWindow mehrere Elemente habe, möchte ich einige Controls davon (hier: Grid) in einem seperatem Fenster anzeigen (Für mehrere Monitore)
Also auf dem MainWindow soll das Grid immernoch angezeigt werden, wie vorher, und in dem neuen Fenster soll das Grid jetzt auch angezeigt werden, nur hat er hier halt mehr "Platz".
Dann kommt aber die bekannte Exception:

InvalidOperationException
Bei dem angegebenen Element handelt es sich bereits um das logische untergeordnete Element eines anderen Elements. Führen Sie zuerst eine Trennung durch.


        private void btnReportExpOut_Click(object sender, RoutedEventArgs e)
        {
            ExpanderOutWindow win = new ExpanderOutWindow();
            Grid grid = this.MainGrid;
            win.contentCtrl.Content = grid; // Boom
            win.ShowDialog();
        }

Wie kann ich mehrere Elemente mehrmals anzeigen ? Oder besser, wie führe ich diese Trennung durch ohne jedes einzelne Controls mehrmals zu instanzieren, die Referenz soll hierbei ja auch behalten werden.

02.03.2010 - 09:18 Uhr

Morgen,
Ich möchte Images in in meiner ListBox anzeigen (15)
Die Bilder werden aus dem Web "getreamt" und wenn die Items per ItemsSource hinzugefügt werden, hängt die Anwendung natürlich ein paar Sekunden.
Um dies zu vermeiden wollte ich die BitmapImages im Thread streamen und nachher den Image-Objekten zuweisen. Habe aber die ganze Zeit das Problemn mit dem Thread-Übergreifenden Zugriff. Im Internet habe ich gelesen, das man deswegen das BitbapImage Objekt freezen muss. Beim Freeze() gibt es aber eine Exception, das das Objekt nicht fixiert werden kann.
Jetzt frage ich mich, wie ich das Problem lösen soll.

Die BilderUrls werden per ImageStrings übergeben und die ItemsSource ist an
LoadedImages gebunden.


    public partial class ImagePreviewScroller : UserControl
    {
        public static readonly DependencyProperty LoadedImagesProperty =
            DependencyProperty.Register("LoadedImages", typeof(IEnumerable<Image>), typeof(ImagePreviewScroller), new UIPropertyMetadata(new List<Image>()));

        public ImagePreviewScroller()
        {
            InitializeComponent();
            this.ImageStrings = new List<string>();
            this.Loaded += new RoutedEventHandler(ImagePreviewScroller_Loaded);
        }

        public List<Image> LoadedImages
        {
            get { return (List<Image>)GetValue(LoadedImagesProperty); }
            protected set { SetValue(LoadedImagesProperty, value); }
        }

        public List<string> ImageStrings { get; set; }

        void ImagePreviewScroller_Loaded(object sender, RoutedEventArgs e)
        {
            ImagesStreamer streamer = new ImagesStreamer(this.ImageStrings, this.Dispatcher);
            streamer.StreamFinished += new EventHandler<ImagesStreamer.StreamFinishedEventArgs>(streamer_StreamFinished);
            streamer.StreamAsync();
        }

        void streamer_StreamFinished(object sender, ImagePreviewScroller.ImagesStreamer.StreamFinishedEventArgs e)
        {
              this.Dispatcher.BeginInvoke(DispatcherPriority.Normal, (Action)delegate()
                    {
                List<Image> images = new List<Image>();
                foreach (var source in e.Sources) // auf e.Sources kann er wegen eines anderen Threads nicht zugreifen
                {
                    Image img = new Image();
                    img.Source = source;
                    images.Add(img);
                }
                LoadedImages = images;
             });
        }


        private class ImagesStreamer
        {
            public event EventHandler<StreamFinishedEventArgs> StreamFinished;

            private Thread currentThread;
            private IEnumerable<string> imageStrings;
            private Dispatcher dispatcher;

            public ImagesStreamer(IEnumerable<string> imageStrings, Dispatcher dispatcher)
            {
                this.imageStrings = imageStrings;
                this.dispatcher = dispatcher;
            }

            public void StreamAsync()
            {
                currentThread = new Thread(Stream);
                currentThread.Start();
            }

            private void Stream()
            {
                List<BitmapImage> sources = new List<BitmapImage>();
                foreach (var imgString in this.imageStrings)
                {
                    BitmapImage bi = new BitmapImage();
                    bi.BeginInit();
                    bi.UriSource = new Uri(imgString, UriKind.Absolute);

                    bi.EndInit(); // Hier wird das Bild "geladen"
                   // bi.Freeze(); // Hier käme die Exception mit dem fixieren

                    sources.Add(bi);
                }
                OnStreamFinished(new StreamFinishedEventArgs(sources));

                //if (currentThread != null)
                //    currentThread.Abort();
            }

            private void OnStreamFinished(StreamFinishedEventArgs e)
            {
                if (StreamFinished != null) StreamFinished(this, e);
            }


            public class StreamFinishedEventArgs : EventArgs
            {
                public StreamFinishedEventArgs(List<BitmapImage> sources)
                {
                    this.Sources = sources;
                }

                public List<BitmapImage> Sources { get; set; }
            }
        }

23.02.2010 - 16:33 Uhr

Die Models brauche ich die ganze zeit, weil zwischendurch Änderungen eintreten.
Die Listen mit den ViewModels werden die ganze Zeit angezeigt.
Hätte ja sein können, das jemand irgend ne Idee hat, das anders aufschreiben zu können, ohne das man so vielen Listen in die MainWindowViewModel schreibt.

23.02.2010 - 09:06 Uhr

Moin,
nach der hitzigen Diskusion hier, mal wieder eine simplere Frage.
Mich interessiert, wie ihr eure Listen und eure ViewModels zwischenlagert.

Wenn ihr zum Beispiel eine Reihe von AUswertungen habt, eine Liste mit 50 Fahrzeugen, dessen Standtage am längsten sind,
50 Fahrzeuge, dessen Price am höchsten sind, 50 Fahrzeuge, dessen km Stand am meisten sind usw.
Angenommen ihr habt so wie ich 10 Listen (und könnte noch mehr werden).
Diese Listen mit Models habe ich in meiner MainWindwViewModel. (Ab und zu verändern sich Werte und diese werden dann wieder abgespeichert)
Jetzt bräuchte ich ja auch noch 10 Listen mit ViewModels davon, wenn ich diese Daten anzeigen möchte.
Also:


// Pseudo
public class MainWindowViewModel
{

private List<Model> list1;
private List<Model> list2;
private List<Model> list2;
//usw.

public List<ViewModel> listViewModels1;
public List<ViewModel> listViewModels2;
public List<ViewModel> listViewModels3;
//usw.

Wie würdet ihr diese Listen aufbewahren, oder das ganze organisieren ??
Irendwie schreibt man sich hierbei dumm und dämlich;)

18.02.2010 - 18:29 Uhr

Noch einmal zu dem Thema 1ViewModel pro Model / 1ViewModel pro View
Ich habe in dem sehr bekannten Artikel von Josh Smith jetzt nochmal folgendes gefunden:

...mit „ViewModel“ enden, wenn es sich bei der Klasse um die Abstraktion einer Ansicht handelt.

und weitere Aussagen, die diesen Inhalt wiedergeben.
WPF-Anwendungen mit dem Model-View-ViewModel-Entwurfsmuster

Also laut der Meinung von Josh Smith und John Gossman, glaube beides Microsoft MVPs, 1ViewModel pro View.

16.02.2010 - 20:07 Uhr

Ich meinte das so,
du erstellt eine ViewModel pro Model also 1:1. Alle Eigenschaften des Models sind in der ViewModel implementiert.
Wenn du jetzt eine Aktualisierungs Methode oder so hast, wo du Werte von dem Model ändern möchtest, änderst du diese Werte per ViewModel oder hast du eine seperate Liste mit Models, wo du die Werte direkt drinne änderst und dann das ViewModel nachträglich aktualisierst?

Der Vorteil ist, wenn man Werte des Models über das ViewModel ändert (wenn man auch PropertyChanged in den Settern des ViewModels implementiert hat) das sich sofort die View und zusätzlich auch das Model aktualisiert.

16.02.2010 - 16:26 Uhr

Ist es denn nun so, das du die ViewModels allgemein als Schnittstelle für die Models benutzt ? Nicht nur für die View sondern auch im Businesscode ?

Wenn du Werte des Models ändern möchtest, holst du dir nicht dein Model aus einer Liste und änderst es und erstellst das ViewModel neu? Oder änderst du im Businesscode die Models auch über dem ViewModel und somit wird ja automatisch dann die View (über PropertyChanged im Setter des ViewModels) und das Model aktualisiert.

Wichtige Sache.

16.02.2010 - 14:45 Uhr

Es ist so
Alles was Businesslogik ist, ist in den Models, und die arbeiten alle miteinander. Views und ViewModels sind der Businesslogik absolut unbekannt.

Und wie verändere ich dann Eigenschaften von Models und setzte die ViewModels in Kenntnis ohne bei den Models ein INotifyPropertyChanged zu implementieren ?
Das ist so ziemlich meine wichtigste Frage.
Du meintets ja gerade:

INotifyPropertyChanged implementiert ich in meinen Models nie, war bisher auch nicht nötig.

Wenn ich jetzt z.B. alle Eigenschaften und alle Commands in ein ViewModel implementiere und angenommen ich brauche diese Commands nur in einer View und in 3 anderen Views nicht, da reichen mir dann nur die Eigenschaften und alle 4 greifen auf dieses eine ViewModel zu, ist das dann noch richtig gekapselt ??

Wie sieht das eigentlich aus, ist es allgemein "weiter verbreitet" ein ViewModel pro Model zu schreiben oder halt nur deine persönliche Meinung. Mir gehts einfach darum ob diese Meinung von deiner Überzeugung kommt oder ob du einige kennst, die so programmieren und nicht ein ViewModel pro View implementieren.
(Nicht das ich deine Fachkompetenz anzweifel;) auf keinen Fall, mich interessiert das einfach nur.

16.02.2010 - 14:23 Uhr

Warum? Die ViewModels sollten immer alles der Models abbilden, allein schon um auf die verschiedenen Views bereit zu sein, spätestens bei der Lokalisierung werden die Views unterschiedlich auf die ViewModels zugreifen.

Das wirft ja wieder das Thema auf ob man 1 ViewModel pro Model erstellt (so wie du das machst, glaube ich) oder 1 ViewModel pro View (wie ich das zur Zeit mache) und da dann nur die Eigenschaften implementiere, auf die die View zugreift.

Ich hatte das eigentlich immer so verstanden, das die ViewModels halt NUR zum Kommunizeren der Models mit den View dienen.
Wenn ich jetzt aber alle Eigenschaften eines Models in ein ViewModel schreibe und dann im Businescode auf das ViewModel zugreife um ein Model zu ändern, ist das ViewModel ja auch die allgemeine Schnittstele also ein Wrapper um auf die Models zuzugreifen und dann brächte ich auch keine einzelnen Model Listen mehr sondern nur die Liste mit den ViewModels und das Model ist dann nur die Datenspeicherung bzw. die Datenquelle und mehr nicht.

Ich weiß auch nicht 100% welche Weg der bessere ist... "bessere" relative Geschichte...

16.02.2010 - 13:10 Uhr

Jetzt in diesem Thread von dir die Aussage

INotifyPropertyChanged implementiert ich in meinen Models nie, war bisher auch nicht nötig.

Zitat vom anderen Thread von dir:

Wenn sich die Daten im Model ändern, und das ViewModel muss aktualisiert werden, ist es normal das das Model ein Event absetzt welches das ViewModel fängt.

Manchmal braucht man doch (und ich finde oft) eine PropertyChanged im Model um die ViewModel und somit auch die View zu aktualisieren.
In meinem ViewModels sind ja nicht immer alle Eigenschaften des Models beschrieben und somit brauche ich die Models um diese ändenr zu können und nicht die ViewModels.

Ich habe aktuell eine Klasse wo ich 4 Liste mit Models habe und 4 Listen mit deren ViewModels. Das gefällt mir aber nicht, weils auch immer zu viel Schreibarbeit ist.

Wie löse ich das denn jetzt am besten (Ich muss oft auf die Liste mit Models zugreifen und manchmal auch auf die Liste mit den ViewModels) hmpf...

16.02.2010 - 10:14 Uhr

Es gibt mal wieder ein paar Fragen zu MVVM, einige Sachen sind mir da nicht so wirklich 100% klar.

  1. Bezeichnet man eigentlich nur sogenannte Entity-Objekt als Models ?
    Also wenn ich z.B eine Klasse Car habe und einige davon in einer Liste anzeige, dann bezeichnet man die Car Klasse als Model.
    Bezeichnet man eine Klasse, die z.B. Auswertungen vornimmt aber nicht als solche direkt in einem View angezeigt wird, sondern nur Werte der Car Objekte ändert auch als Model ?
    Also bei jeglichen Businesscode oder nur bei "Entity" Objekten spricht man vom Model?

  2. Die Stelle wo ich immer am meisten nachdenke ist, wenn ich jetzt ein Model hab (Car von mir aus wieder) und ich möchte dessen Eigenschaften in einer View anzeigen.
    Möchte das man die Daten nur ansehen kann (also nur ein Getter). Reicht es hierbei nicht das Model in dem ViewModel auf public zu setzen und INotifyPropertyChanged im Model zu implementieren (siehe Refresh Methode oben im Thread).


public Car Car
{
get{return this.car;}
}

Wenn ich jetzt in dem ViewModel wieder jede Eigenschaft schreibe


public string CarID
{
get{return this.car.ID;}
}

... ist doch eigentlich doppelt gemoppelt oder nicht?
Ich muss dann nämlich INotifyPropertyChaned im Model implementieren um das ViewModel eventuell zu aktualisieren und im ViewModelum die View zu aktualisieren...
Wie seht ihr das ?
Ich meine, wenn ich von einer View aus Werte editieren möchte und erst einmal zwischen speichere, dann schreibe ich diese Eigenschaften im ViewModel aus, aber wenn man nur Daten anzeigen möchte, dann auch ?

  1. Behaltet ihr neben der ObservableCollection mit den ViewModels, die in einer View angezeigt werden auch eine Liste mit Models, oder holt ihr euch nur die Models, in dem sie in den ViewModels auf public gesetzt wurden und ihr dann mit einer Schleife alle ViewModels durchgeht ? Oder wie gesgat immer eine ViewModel und dazu eine Model Liste ??
03.02.2010 - 17:05 Uhr

Habs geschafft.

Lösung:


            // CollectionView fürs Sortieren holen (um den CustomSort zu setzen)
            ListCollectionView cv = (ListCollectionView)CollectionViewSource.GetDefaultView(this.lv.ItemsSource); // Diese Schreibweise veranlasst, dass die Referenz behalten wird.
            if (cv == null)
                return;

            // Sortieren
            cv.CustomSort = new ListSortHelper(this.sortInformation);
            this.lv.Items.Refresh(); // schneller als cv.Refresh() | ka wieso