Laden...
Avatar #avatar-3191.gif
MarsStein myCSharp.de - Experte
Sr. Softwareentwickler (ophthalmologische Lasersysteme) Trier -> München Dabei seit 27.06.2006 3.170 Beiträge
Benutzerbeschreibung

Forenbeiträge von MarsStein Ingesamt 3.170 Beiträge

11.05.2022 - 19:44 Uhr

Hallo,

was hindert Dich daran, den Code in eine Methode auszulagern, der Du den ServiceController übergibst?

Gruß, MarsStein

08.05.2022 - 13:31 Uhr

Hallo,

ohne jetzt den Code genau angeehen zu haben, mal 2 Schüsse ins Blaue:

  1. Könnte es sein, dass die Firewall dazwischengrätscht?
  2. Passt das mit den IP-Adressen und den Subnetzmasken? 192.168.178.31 und 192.168.204.1 liegen ggf. in unterschiedlichen Subnetzten (mit unterschiedlichen Broadcast-Adressen), falls Du die Standardmaske 255.255.255.0 verwendest.

Gruß, MarsStein

03.05.2022 - 22:38 Uhr

Hallo zusammen,

einzig entscheidend ist was Abt bereits geschrieben hat:

Du musst den Inhalt einer Datei immer mit dem Encoding lesen, mit der die Datei geschrieben wurde.
Danach kannst Du sie in ein solches Encoding überführen, wie Du es brauchst.

Wenn beim Lesen das Encoding nicht bekannt ist, kann man versuchen, die Datei nach bestimmten Kriterien (die jetzt den Rahmen sprengen würden) zu untersuchen, um so das Encoding automatisch zu ermitteln, wie es elaborierte Texteditoren tun - aber selbst die erkennen es nicht zu 100% richtig.

Gruß, MarsSetin

03.05.2022 - 22:29 Uhr

Hallo,

Trotzdem verlässt Du Dich hier auf den Zufall. Du wirst niemals zu 100% sagen können, dass 2 Dateien, bei denen ein bestimmter Byte-Bereich gleich ist, auch insgesamt gelich sind.
Alle Tools, die hier mit Checksummen arbeiten, tun dies i.d.R. nur für eine Erstprüfung, und bei einem Match wird ein kompletter Binärverglech durchgeführt. Erst der stellt sicher, dass das, was zunächst mal gleich aussieht, auch wirklich identisch ist. Bei einer Auswahl eines bestimmten Byte-Bereichs innerhalb von Dateien hast Du genau das gleiche Problem - wobei mir hier die Checksummen noch effektiver erscheinen.

Gruß, MarsStein

03.05.2022 - 22:08 Uhr

Hallo,

Es genügt mir, wenn die aktuelle Version immer online ist und die lokalen Daten überschrieben werden.

Bei der Anforderung fällt mitr als erstes ein, das mit OneDrive zu machen.
ABER: Eine Versionskontrolle wie unter GitHub ist wesentlich besser. Sonst kommt ganz sicher irgendwann der Punkt, an dem du dir die Seele aus dem Leib fluchst, dass Du nicht auf einen Stand von vor ein paar Tagen/Wochen zurückgehen kannst.

Gruß, MarsStein

14.04.2022 - 22:36 Uhr

Hallo,
ich war ja lange nicht mehr hier - ich hoffe das ändert sich bald wieder.
Bei meinem aktuellen Besuch ist mir aufgefallen, dass die "Themen ohne Antwort"-Funktion sich seltsam verhält:
Wenn ich in einen bestijmmten Forenbereich - z.B. "GUI: WPF und XAML" - wechsle, und dort auf "Themen ohne Antwort" klicke, würde ich erwarten, dass ich nur Themen ohne Antwort aus dem aktuellen Forenbereich bekomme. Tatsächlich bekomme ich aber überall die Themen ohne Antwort aus sämtlichen Forenbereichen angezeigt.
Ich weiß auch ehrlich gesagt nicht genau, ob das jemals anders war. und ich habe jetzt auch (sorry) nicht diesem gesamten Thread hier gelesen unḿ rauszufinden, ob das schon mal jemand angesprochen hat - oder vielleicht habe ich ja auch nur einen forenbereich-spezifischen Link übersehen, und jemand kann mir auf die Sprünge helfen 🙂

Gruß, MarsStein

14.04.2022 - 22:19 Uhr

Hallo,

PathGeometry hat aber kein Property für einen Style.

Richtig. Der Style kommt erst mit dem FrameworkElement, und das ist Deinem Fall eben erst der Path.
Das bedeutet, man müsste allen einzelnen PathFigures eine eigene PathGeometry und diesen wiederum einen eigenen Path verpassen, statt alles zusammen in einem Path zu zeichnen.
Ich hab es jetzt nicht ausprobiert, aber dann müsste/sollte es auch mit Style und Trigger funktionieren.

Gruß, MarsStein

17.05.2021 - 14:49 Uhr

Hallo,

wo wird denn die Methode Begruessung() der Klasse ABC überhaupt aufgerufen?
Ohne Aufruf wird kein Event ausgelöst...

Gruß, MarsStein

02.02.2021 - 18:01 Uhr

Hallo zusammen,

ich möchte mich in die Liste der Gratulanten einreihen und auch meinen herzlichen Dank aussprechen.
Es ist schon beeindruckend, was das Entwicklungsteam der neuen Software hier geleistet hat. Meinen größten Respekt dafür! 👍
Ihr habt myCSharp.de auf eine zukunftssichere Basis gestellt, und ich finde es super, dass diese jetzt auch .NET ist.
Ich bin gespannt, wie sich die neue Plattform entwickelt.

Alles in allem - weiter so!!

Gruß,
MarsStein

13.12.2020 - 12:32 Uhr

Hallo,

hat FHs.next() nicht einen Rückgabewert, den Du benutzen solltest, um darauf .uname aufzurufen?

Gruß, MarsStein

22.10.2020 - 12:56 Uhr

Hallo,

Du kannst auch mal in meiner Antwort hier schauen:
Object von Window zu Window weiter geben

Unten im Beitrag habe ich ein paar Möglichkeiten für diese Problematik aufgelistet.
Der dort erwähnte ViewManager entspricht dabei dem WindowsService, den MrSparkle nannte.

Gruß, MarsStein

11.10.2020 - 16:33 Uhr

Hallo,

ich würde definitiv ein eigenes Fenster bevorzugen - dann kann man die Informationen auch hübsch darstellen. Der MessageBox sind sehr enge Grenzen gestetzt, was Styling/Layout/Formatierung angeht.

Gruß, MarsStein

11.10.2020 - 16:17 Uhr

Hallo,

Firebird wäre auch noch eine Alternative - ebenfalls komplett frei und mit .NET Unterstützung. Kann als Server oder embedded laufen, und man kann leicht dazwischen wechseln.

Gruß, MarsStein

11.10.2020 - 16:12 Uhr

Hallo,

bei Commands auf Buttons ist für das enablen/disablen normalerweise die CanExecute-Methode und das CanExecuteChanged-Event zuständig. Wenn Du die richtig implementierst, solte Dein Button vom Command die Information automatisch erhalten.

Edit: Und ich sollte richtig lesen - kein ausgewählter Employee, kein Command, kein CanExecute... dann wie JimStark geschrieben hat, über IsEnabled.

Gruß, MarsStein

10.08.2020 - 15:18 Uhr

Hallo zusammen,

nur der Vollständigkeit halber, EF unterstützt seit Version 6.3.0 .NET Standard 2.1 und ist damit auch in .NET Core lauffähig.
Das steht auch so in den von Abt verlinkten Release Notes:

Support for .NET Core 3.0
- The EntityFramework package now targets .NET Standard 2.1 in addition to .NET Framework 4.x.
- This means that EF 6.3 is cross-platform and supported on other operating systems besides Windows, like Linux and macOS.
- The migrations commands have been rewritten to execute out of process and work with SDK-style projects.

Weiterentwickelt wird es aber trotzdem nicht mehr, und für Neuentwicklungen ist EF Core daher wärmstens zu empfehlen.

Gruß, MarsStein

01.08.2020 - 13:13 Uhr

Hallo,

Offensichtlich finde ich nicht die geeigneten Suchbegriffe für das Forum oder Suchmaschinen

Versuch es mal mit "windows forms high dpi support". Funktioniert aber erst ab .NET 4.7

Gruß, MarsStein

30.07.2020 - 15:30 Uhr

Hallo,

args[0] ist der Name der Anwendung selber.

Nein. Nicht in C#/.NET.

Gruß, MarsStein

14.07.2020 - 09:30 Uhr

Hallo,

wann wird denn VM3 erstellt?
Das riecht danach, dass das erst nach dem Aufruf von Publish passiert. Dann bekommst Du das Event nicht mehr mit, weil Du zu spät subscribst.

Gruß, MarsStein

15.06.2020 - 17:23 Uhr

Hallo,

Was tut euch denn so weh einfach master in main umzubenennen?

Gar nichts, ich werde das auch tun.

Geht's auch da kleinlich (ich verwende einfach das Wort wieder) um die Gewohnheit oder das Prinzip? Womit sich die Antwort darauf dann erübrigt.
Den Nutzen stelle ich trotzdem in Frage.

Gruß, MarsStein

15.06.2020 - 16:33 Uhr

Hallo zusammen,

also vorweg: die Diskussion in allen Ehren, und jeder sollte sich so seine Gedanken machen.

Aber bei technischen Begriffen wie hier bei den Branches oder dem von Th69 angesprochenen Master/Slave finde ich die Diskussion teilweise kleinlich bis peinlich.
Wahrscheinlich werden bestimmte Begriffe irgendwann vollkommen aus unserem Wortschatz verschwinden. Ob damit dann jemand geholfen ist, halte ich eher für fraglich.

Bin mal gespannt, wie dann in Zukunft z.B. Mastering/Remastering im Audiobereich genannt werden,
und wie lange man die Begriffe "herrlich" und "dämlich" noch verwenden darf (ok, das ist eine andere Baustelle, aber ähnlich geartet) ...

Gruß, MarsStein

01.06.2020 - 11:49 Uhr

Hallo,

eine wichtige Anmerkung zu der Extension-Methode im Startbeitrag, da hier offenbar ein massives Verständnisproblem bezüglich Delegates/Events vorliegt: Diese Methode bringt gar nichts!
Sobald ein EventHandler einer Variable zugewiesen oder als Parameter übergeben wird, arbeitest Du nur noch auf einer **Kopie **des EventHandlers.
Aus dieser Kopie werden zwar mit der Extensionmethode alle Handler entfernt, das interssiert aber den ursprünglich an die Methode übergebenen EventHandler nicht die Bohne - da bleibt alles weiter registriert.

Gruß, MarsStein

12.05.2020 - 17:09 Uhr

Hallo MrSparkle,

ich hatte es so interpretiert, dass der Benutzer sehen soll, wenn irgendwo sonst durch irgeneine Aktion im Code der Watcher ein- oder ausgeschaltet wird.
Also quasi eine Überwachung der Property, egel von wo oder wodurch sie geändert wird. Vielleicht habe ich das aber auch missverstanden. Das weiss nur der TE...

Gruß, MarsStein

12.05.2020 - 16:51 Uhr

Hallo,

Im Grunde brauchst du ein ViewModel, das das Event vom FileSystemWatcher abonniert, und darauf reagiert, indem es eine Eigenschaft ändert, an die du deine Textbox gebunden hast.

Es geht ja hier um die Property FileSystemWatcher.EnableRaisingEvents, und wenn sich diese ändert, gibt es eben kein Event, auf das man reagieren könnte.
Deshalb denke ich auch, dass ein Wrapper die richtige Lösung ist. Zumindest sollte man den FileSystemWatcher in irgend einer Weise so kapseln, dass das Property nur über eine eigene Klasse gesetzt werden kann, dann kann man bei Änderung des Wertes auch eine eigene Notification auslösen.

Gruß, MarsStein

12.05.2020 - 15:48 Uhr

Hallo KroaX,

schau mal ins Wikipedia: MySQL, Absatz "Kritik"

ich denke das fasst es einigermaßen kurz und bündig zusammen.

Gruß, MarsStein

08.05.2020 - 12:39 Uhr

Hallo,

das kann nicht funktionieren, weil der FileSystemWatcher nicht INotifyPropertyChanged implementiert.
Es werden also keine Nachrichten über die Änderung dieser Property generiert, folglich kann die GUI auch keine solchen Benachrichtigungen erhalten.

Gruß, MarsStein

23.04.2020 - 18:05 Uhr

Hallo,

ich programmiere einen Dienst generell immer so, dass die ganze Logik in einer eigenen Assembly (oder mehreren) liegt, und ich dann auch ein minimales Konsolenprogramm schreiben kann, welches diese Logik ausführt. Das ist bei Diensten auch immer möglich.
Das ist oft sehr hilfreich beim Debuggen und bei der Fehlersuche, und ich kann dieses Vorgehen aus Erfahrung wärmstens empfehlen.

Gruß, MarsStein

22.04.2020 - 11:21 Uhr

Hallo,

NTFS unterstützt auch Links auf Dateisystemebene (ähnlich Linux-Dateisystemen).
Damit müsste es funktionieren.
Schau mal unter NTFS links.

Gruß, MarsStein

21.04.2020 - 13:10 Uhr

Hallo,

Wo ist mein Denkfehler?

Hier:

das Control das in dem DataTemplate steckt ist ein Viewmodel

Ein Control ist niemals ein ViewModel, sondern eine View.
Das Objekt, das Du per Binding mit dieser View verbindest, ist ein ViewModel - also das, was Du hier als Model bezeichnest.

Schau Dir nochmal ein paar Artikel zu MVVM an, z.B. [Artikel] MVVM und DataBinding , hier liegt offenbar noch ein grundsätzliches Verständnisproblem vor.

Gruß, MarsStein

20.04.2020 - 21:58 Uhr

Hallo,

in der aus einer ObservableCollection von Models dynamisch per ItemsContol template die zugehörigen ViewModels geladen werden. Klingt seltsam. Gänging wäre eher eine ObservableCollection von ViewModels, und die View wird dann automatisch per ItemsControl.ItemTemplate erstellt.

Wenn Deine ObservableCollection tatsächlich Models enthält, und Du dann sagst:

Das binding der Daten aus den Objekten der ObservableCollection zum XAML funktioniert soweit, Dann klingt das danach, dass Du die Models direkt ans zum XAML bindest. Wo bleiben dann die ViewModels?

Kannst Du mal zeigen, was Du da eigentlich machst?

Gruß, MarsSTein

08.04.2020 - 19:34 Uhr

Hallo,

zusätzlich solltest Du am Ende eines Befehls einen Zeilenumbruch (Environment.NewLine) am Ende mitschicken, denn auf der Konsole wird der Befehl ja auch für gewöhnlich erst durch das Drücken der Enter-Taste ausgelöst.

Gruß, MarsStein

26.03.2020 - 10:47 Uhr

Hallo,

nimm die Überladung für String.Split, die StringSplitOptions annimmt, und übergebe StringSplitOptions.RemoveEmptyEntries.

Das hättest Du leicht selbst der Doku entnehmen können.

Gruß, MarsStein

01.03.2020 - 16:15 Uhr

Hallo,

im gezeigten Code hast Du für das Binding an die DataGridTextColumn keinen Converter gesetzt, da versuchst Du also, ein bool an ein Element zu binden, dass eine Visibility erwartet.

Gruß, MarsStein

13.01.2020 - 22:13 Uhr

Hallo,

die Endlosrekursion kann (relativ) leicht entstehen, wenn Du z.B. auf einer - irgendwo im Baum durch Ermitteln der zugehörigen Paletten zu einem gefundenen Sub-Vorgang - gefundenen Palette nochmal auf einen bereits gefundenen Vorgang stößt (z.B. den ursprünglichen, über den Du in die Suche startest).
Du musst also irgendwie sicherstellen, dass bereits gefundene Vorgänge oder Paletten nicht nochmal berücksichtigt werden.
Entweder Du setzt mehrere SQL-Queries ab, die diese Logik abbilden, oder Du versuchst, die Logik in einer Stored Procedure zu implementieren.
Das in einem einzigen SQL-Statement abzubilden, wird jedenfalls ziemlich schwierig (wenn nicht unmöglich) werden.

Gruß, MarsStein

09.01.2020 - 22:46 Uhr

Hallo,

zunächst mal schließe ich mich Abt an:

VS ist nur eine Entwicklungsumgebung; das hat null mit Sqlite zutun.

LiteDB ist eine NoSQL Datenbank; also ein völlig anderes Paradigma (mit allen Vor- und Nachteilen)als Sqlite.

Allerdings kann man bei einer Evaluierung eines geeignten Datenbanksystems heutzutage durchaus NoSQL auch mal in Betracht ziehen. Was sich besser eignet, sollte die Evaluierung ergeben.

Wenn es um Alternativen geht, seien noch folgende genannt:
Firebird (SQL, embedded oder als Server möglich)
CouchDB (NoSQL)

Gruß, MarsStein

06.01.2020 - 13:50 Uhr

Hallo,

Unter den oben genannten Bedingungen ist der Typ<T> doch bekannt?

Inwiefern?
Was hindert mich daran, so etwas zu schreiben:

public class MyClass
{
    public bool Equals<T>(T value)
    {
         //...
    }
}

// und dann so aufzurufen:

MyClass c = new MyClass();

if(c.Equals<int>(42)) // statt int könnte ich hier auch JEDEN ANDEREN TYPEN einsetzen. 
{
}

Main Rat: Schau Dir mal IEquatable<T> an, und verwende es.

Gruß, MarsStein

Gruß, MarsStein

06.01.2020 - 12:24 Uhr

Hallo,

Abgesehen von dem was LaTino bereits geschrieben hat, auch die generische Implementierung:

XmlSerializer serializer = new XmlSerializer(typeof(T));
serializer.Serialize(xmlWriter, this);

Das dürfte gewaltig rumpeln, wenn this nicht gerade vom Typ T ist.

Wenn man schon eine Equals-Methode zur Verfügung stellt, sollte wenigstens dafür georgt sein das sie auch sicher ist.
Meiner Ansicht nach sollte dann zumindest auch IEquatable<T> implementieren.

Generell sollten Snippets universell und sicher einsetzbar sein - das ist hier nicht der Fall.

Gruß, MarsStein

05.01.2020 - 20:26 Uhr

Hallo,

Die UserControl wird ja wie ein Child behandelt, mit dem MainWindow als Parent, richtig? Ja, korrekt.
In diesem Fall, wenn ich den DAtaContext also an der Stelle rausnehme, verwendet das UC den DataContext des MainWindows? Andernfalls würde das Binding ja nicht funktionieren, oder? Generell ist es so, dass Child-Controls den DataContext des Parent automatisch bekommen, sofern man ihn nicht anders besetzt.
Beim ItemsControl ist es aber so, dass jedes darin enthaltene Child-Control als DataContext das jeweilige zugeordnete Item aus der ItemsSource bekommt.
Dadurch werden in Deinem Beispiel automatisch die PathViewModels, die in der (als ItemsSource gebundenen) ObdservableColection stecken, als DataContext für die über das ItemTemplate erstellten Items fungieren. Daher funktioniert das Binding - der DataContext im Item ist immer das zugehörige Objekt aus der ItemsSource.

Kennt damit mein ItemsViewModel nicht automatisch mein PathViewModel? Ist das dann MVVM-konform? Zweimal ja. Typischerweise hat man beim MVVM eine Art Baumstruktur der ViewModels, und es ist völlig in Ordnung, dass übergeorndete ViewModels die untergeordneten ViewModels kennen - das ist sogar meistens notwendig.
Wichtig ist dabei, dass das alles auf ViewModel-Ebene passiert. Gegen MVVM würde es dann verstoßen, wenn (wie in Deinem ursprünglichen Code) in der ViewModel-Ebene das UserControl selbst bekannt sein müsste, da das UserControl eben zur View-Ebene gehört.

Das Command wird ja vom MainViewModel (ItemsViewModel) ausgeführt, aber muss doch an der Stelle eine neue Instanz des PathViewModels erstellen, oder?

Genau, es muss eine Instanz des PathViewModels erstellt werden. Dafür ist aber eben das MainViewModel zuständig, denn es enthält ja die Collection der PathViewModels und muss diese auch pflegen.

Was ich mit "einzeln steuern" meinte, ist die Random-Funktionalität. Wenn Du für jedes PathViewModel einzeln den Index zufällig neu besetzen willst, dann brauchst Du dafür die Funktioaltät im PathViewModel selbst.

Gruß, MarsStein

04.01.2020 - 23:31 Uhr

Hallo,

ich bin bisher der Ansicht, wenn ich im XAML einer view eine local:ItemsViewModel-Variable deklariere, dass sie dann jede View zur genau gleichen Instanz referenziert. Das ist offenbar falsch?

Ja, das ist falsch. Es wird durch diese Deklaration für jedes UserControl eine eigene Instanz des ViewModels erstellt. Und diese Instanzen wissen eben nicht, dass Du in einer anderen Instanz, die als DataContext im MainWindow lebt, sich irgend eine Index-Property ändert.

Kapier ich jetzt nicht: welches UserControl habe ich denn ans MainWindow gebunden?

Stimmt, mein Fehler... Ich meinte ViewModel, nicht UserControl.

Zum Code:

  1. Nimm aus Deinem UserControl die DataContext-Deklaration raus:
<UserControl x:Class="UserControlTest.PathControl"
             ...
    <StackPanel Orientation="Horizontal">
        <ComboBox Margin="10" MinWidth="60" VerticalAlignment="Center" ItemsSource="{Binding  AvailableNumbers}" SelectedIndex="{Binding TheIndex}"/>
        <TextBox Margin="10" MinWidth="120"/>
    </StackPanel>
</UserControl>
  1. Im MainWindow verpasst Du dem ItemsControl ein ItemTemplate:

            <ItemsControl ItemsSource="{Binding PathViewModels}">
                <ItemsControl.ItemTemplate>
                   <DataTemplate>
                      <local:PathControl> 
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
  1. Trenne die ViewModels auf, ungefähr so (nicht getestet, nur Deinen Code hier im Editor etwas umgebaut, müsste aber grob funktionieren oder zumindest die Vorgehensweise verdeutlichen):
public class PathViewModel
{
        public ObservableCollection<int> AvailableNumbers { get; set; } = new ObservableCollection<int>();

        private int _theIndex;

        public int TheIndex
        {
            get { return _theIndex; }
            set
            {
                _theIndex = value;
                OnPropertyChanged(ref _theIndex, value);
            }
        }

        public PathViewModel()
        {
            AvailableNumbers.Add(1);
            AvailableNumbers.Add(2);
            AvailableNumbers.Add(3);
            AvailableNumbers.Add(4);
            AvailableNumbers.Add(5);
        }
}

public class ItemsViewModel
{
        public ObservableCollection<PathViewModel> PathViewModels { get; set; } = new ObservableCollection<PathViewModel>();

        public ItemsViewModel()
        {
            UCCreationCommand = new CommandDelegateBase(UCCreationExecute, UCCreationCanExecute);
            UCDeletionCommand = new CommandDelegateBase(UCDeletionExecute, UCDeletionCanExecute);
            ChangeIndexCommand = new CommandDelegateBase(IndexExecute, IndexCanExecute);
        }

        public ICommand UCCreationCommand { get; set; }
        public ICommand UCDeletionCommand { get; set; }
        public ICommand ChangeIndexCommand { get; set; }


        private bool UCCreationCanExecute(object paramerter)
        {
            if (PathViewModels.Count < 8)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        private void UCCreationExecute(object parameter)
        {
            PathViewModel p = new PathViewModel();

            PathViewModels.Add(p);
        }

        private bool UCDeletionCanExecute(object paramerter)
        {
            if (PathViewModels.Count != 0)
            {
                return true;
            }
            else
            {
                return false;
            }

        }

        private void UCDeletionExecute(object parameter)
        {
            PathViewModels.RemoveAt(PathViewModels.Count -1);
        }

         private bool IndexCanExecute(object paramerter)
        {
            return true;
        }

        private void IndexExecute(object parameter)
        {
            Random rnd = new Random();

            foreach(var pathVM in PathViewModels)
            {
                int x = rnd.Next(0, AvailableNumbers.Count);
                pathVM.TheIndex = x;
            }
        }
}

So, jetzt erstellst Du mit dem Click auf den Button nur ein ViewModel und packst es in die ObservableCollection. Diese ist an das ItemsControl gebunden - und durch das ItemTemplate wird jetzt für jedes PathViewModel, das sich in der Collection befindet, automatisch ein PathControl angezeigt.

Die ChangeIndex-Geschichte hab ich jetzt mal so umgebaut, dass in jedem vorhandenen PathViewModel ein neuer zufälliger Wert gesetzt wird. Wenn Du das einzeln steuern willst, gehört es aber ins PathViewModel und nicht ins MainViewModel (bzw. ItemsViewModel).

Gruß, MarsStein

04.01.2020 - 13:17 Uhr

Hallo,

das kann so nicht funktionieren.
Du erstellst mehrere ItemsViewModel-Instanzen.
Eines davon ist ans MainWindow gebunden, die anderen jeweils an ein PathControl.

Wenn Du jetzt Deinen Button zum Wechseln des Index klickst, wirkt sich das nur auf den Index des UserControls aus, das ans MainWindow gebunden ist -> deshalb kannst Du in den UsderControls keine Veränderung sehen.
Was soll bei Deinem Code Deiner Meinung nach passieren, wenn Du den Button für das Wechseln des Index klickst, und bereits mehrere UserControls vorhanden sind? Wo genau soll dann gewechselt werden?

Die Vorgehensweise ist schon sehr obskur. Du solltest auf jeden Fall das MainViewModel für das MainWindow von den ItemViewModels trennen - und Dir dann überlegen, welche Funktionalität Du in welchem dieser ViewModels brauchst.

Beim Erstellen eines neuen UserControls solltest Du dann lediglich das ItemsViewModel erzeugen (nicht das Control selbst - das widerspricht MVVM, weil Dein ViewModel Teile der View kennt!) und es in die ObservableCollection packen.
Im ItemsControl des MainWindow legst Du dann ein ItemTemplate an, das Dein UserControl enthält. Such DIr dazu am besten ein paar Beispiele, die mit ItemTemplate arbeiten, es ist nicht sehr kompliziert.

Gruß, MarsStein

29.11.2019 - 18:07 Uhr

Hallo,

Ich muss doch eigentlich in meinen DataGrid irgendwo den Style/Key angeben, oder ?

Eigentlich nicht... Du deklarierst diese Resource direkt als Kindelement von deinem DataGrid, dann sollte es passen:

<DataGrid ...>
    <DataGrid.Resources>
        <Style TargetType="Button" x:Key="{ComponentResourceKey ResourceId=DataGridSelectAllButtonStyle, TypeInTargetAssembly={x:Type DataGrid}}">
            <Setter Property="Background" Value="Red" />
        </Style>
    </DataGrid.Resources>
    <!-- Hier der Rest von Deinem DataGrid -->
</DataGrid>

Gruß, MarsStein

12.11.2019 - 21:16 Uhr

Hallo,

Du musst Dir halt für jeden Punkt merken, in welcher Farbe er gezeichnet werden soll - und zwar schon beim hinzufügen der Punkte.

Dafür eignet sich z.B. ein Dictionary<Point, Brush> oder ein Dictionary<Brush, List<Point>> statt der List<Point>.

Gruß, MarsStein

11.11.2019 - 12:57 Uhr

Hallo,

Jedoch möchte ich das Browser-Element nicht in der Anwendung.

Möchtest das Element grundsätzlich nicht verwenden oder einfach nicht anzeigen?
Das Webbrowser-Element funktioniert nämlich auch, wenn es nicht angezeigt wird.

Gruß, MarsStein

05.11.2019 - 09:19 Uhr

Hallo,

Mein Objekt wird nicht benachrichtigt.

Bist Du Dir da sicher? Hast Du versucht, den Wert nach der Änderung im MainViewModel aus der gebundenen Property in Bena mal abzurufen?

meine Debugging-Ausgaben kommen nicht. Das ist jedenfalls nicht verwunderlich, denn über das Binding wird sicherlich nicht Dein Setter aufgerufen, sondern direkt die SetValue-Methode der DependencyProperty. Du kannst also nicht erwarten, dass die Ausgabe automatisch bei jeder Änderung kommt. Die kommt nur, wenn der Wert tatsächlich über Deinen Setter gesetzt wird.
oder eine bessere Idee wie ich das Binding zwischen MVM und meiner Custom-Klasse bewerkstelligen kann?

Ja. Das Gefrickel im CodeBehind sein lassen und das Binding in XAML umsetzen.

Davon abgesehen ist dort der falsche Ort für die Logik der View. Die gehört ins ViewModel. Warum denn? Wenn Bena ein Control ist, an das er einen Wert aus dem ViewModel binden will, dann muss das doch da umgesetzt werden...

Gruß, MarsStein

16.10.2019 - 10:08 Uhr

Hallo,

hinzu kommt noch, dass Du in Deiner Suche()-Methode eine neue Instanz von PrefixTree erstellst, auf der Du dann weiterarbeitest.
Diese Instanz kennt aber die in der Main-Methode hinzugefügten Wörter nicht...

Gruß, MarsStein

11.10.2019 - 20:01 Uhr

Hallo,

denn bei EmployeeListView handelt es sich (wohl) nicht um das UI-Element (denn dieses hat ja gar kein CollectionChanged-Ereignis), sondern um die Collection

In der Tat, da habe ich mich wohl von der Benennung hinreissen lassen - Freitag Nachmittag, puh!

Das bedeutet, was ich bezüglich Views geschrieben habe, trifft hier nicht zu, wir sind die ganze Zeit auf ViewModel-Ebene.

Trotzdem halte ich den Ansatz, über das CollectionChanged-Ereignis zu gehen, aus den ebenfalls genannten Gründen für den falschen Weg.

Gruß, MarsStein

11.10.2019 - 16:23 Uhr

Hallo,

auf jeden Fall Möglichkeit a.)
Und zwar in umgekehrter Reihenfolge: Erst löschst Du das Objekt aus der Datenbank (über ein entsprechedes Datenlayer), und erst wenn das funktioniert hat aus der ObservableCollection im ViewModel. Dann kannst Du auch noch Fehlerbehandlung machen, wenn das Löschen aus der DB schiefgeht, und das Objekt ist in der UI noch vorhanden.

Möglichkeit b.) ist ein völlig falscher Ansatz.
Wenn ein solcher Code

EmployeeListView.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler
(CollectionChangedMethod);

im ViewModel auftaucht, bedeutet das, dass das ViewModel die View kennt und das sollte es nie.

Wenn der Code im CodeBehind steht, verlagerst Du Deine Löschlogik direkt unter Umgehung des ViewModels in die View - und das ist dann auf jeden Fall ein Designfehler.

Auf dieser Grundlage sind dann auch die Aussagen

In MVVM arbeitet man aber nicht mit Code Behind Eventhandling

Das Control gehört da nicht in Dein ViewModel.

hoffentlich verständlich, denn bei dem Ansatz über CollectionChanged trifft auf jeden Fall einer dieser Umstände zu.

Gruß, MarsStein

11.10.2019 - 00:52 Uhr

Hallo,

Machst Du mittlerweile irgendwas anders, oder spielst Du noch im CodeBehind oder sonstwo mit den Mausereignissen rum?
Ansonsten sollte es eigentlich mit meinem Vorschlag funktionieren.

Ich hatte das mehr oder weniger 1:1 mit Deinem Code getestet und nur den Style entsprechend verschoben und angepasst und den fa-Namespace und die zugehörigen Elemente rausgeschmissen, an der Struktur aber sonst nichts geändert. Dabei ergab sich das von Dir beschriebene gewünschte Verhalten.

Gruß, MarsStein

09.10.2019 - 17:48 Uhr

Hallo,

einfach nur eine Klassenbibliothek.
Um using System.Windows.Forms nutzen zu können, musst Du dann noch einen Verweis (Referenz) auf die System.Windows.Forms.dll erstellen.

Gruß, MarsStein

09.10.2019 - 15:29 Uhr

Hallo,

Und auch die Einschränkung "class" ist bei Angabe eines Interfaces überflüssig, denn Interfaces funktionieren generell nur bei Klassen (nicht bei Strukturen).

Nur zur Richtigstellung: Das stimmt nicht. Auch Strukturen können Interfaces implementieren, und dann auch in auf diese Interfaces eingeschränkten Generics benutzt werden.

Gruß, MarsStein