Phase 5-UI: Copytrading-Modul-Views (Master-Trader, Closed Trades, Account-Settings)

- MasterTradersView: Liste + PropertyGrid-Editor + Account-Zuweisung
  (CheckedListBox -> AssignedAccountIds), Neu/Speichern/Loeschen; persistiert
  via ITrackedTraderRepository + synct CopyTradingState.Traders.
- ClosedTradesView: read-only Grid der geschlossenen Copytrades mit
  aufgeloesten Account-/Trader-Namen + Kurzauswertung (ICopyTradeLogRepository).
- AccountSettingsView: Account-Auswahl + PropertyGrid fuer
  CopyTradingAccountSettings, Speichern via Repo + State-Sync.
- IPolyTraderModule.RegisterUi erhaelt jetzt IServiceProvider (Module loesen
  ihre View-Abhaengigkeiten auf); Program uebergibt viewServices.
- CopyTradingModule.RegisterUi registriert die 3 Views (Group "CopyTrading").
- LauncherForm haengt Modul-Views dynamisch als Buttons an toolstrip_windows
  (Core kennt keine Modulnamen; Bindung nur ueber View-IDs).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Richard
2026-07-05 20:09:56 +02:00
co-authored by Claude Opus 4.8
parent b951b912f4
commit 05e0576965
8 changed files with 519 additions and 6 deletions
@@ -1,3 +1,4 @@
using System;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Configuration;
@@ -29,10 +30,11 @@ namespace PolyTrader.Core.Modularity
/// <summary>
/// Registriert die UI-Ansichten des Moduls bei der Shell (Launcher). Die Shell öffnet
/// jede Ansicht auf Wunsch in einem eigenen Host-Fenster. Module liefern designbare
/// UserControls; die Shell bleibt modul-agnostisch.
/// jede Ansicht auf Wunsch in einem eigenen Host-Fenster. Module liefern eigene Forms;
/// die Shell bleibt modul-agnostisch. Über <paramref name="services"/> lösen Module ihre
/// Abhängigkeiten (Repos, State) für die View-Erzeugung auf.
/// </summary>
void RegisterUi(IModuleUiHost host);
void RegisterUi(IModuleUiHost host, IServiceProvider services);
/// <summary>Wird nach der Core-Hydration gestartet (kein Anlaufen gegen leeren State).</summary>
Task StartAsync(CancellationToken cancellationToken);