Wenn es an sowas schon scheitert, geh ich mal ganz stark davon aus, dass du gar nicht genau weißt was du da überhaupt machst.
Du hast eine Server Applikation und eine Client Applikation? Ist die Client Applikation auch ein WPF Projekt? Wie kommunizieren die? Was willst du runterladen?
Ich weiß jetzt nicht ob ich zu kompiliziert oder falsch denke, aber ich kann mir doch so alle aufzählen (ohne Schleife von Abts Link). Dann füge ich alle Matches in eine Liste ein mit einer ID, und schau ob es sie schon gibt, das sollte ja dann noch das einfachste sein.
string[] ms = new string[] { "m1", "m2", "m3"};
string[] ws = new string[] { "w1", "w2", "w3" };
var result = from m in ms
from w in ws
select new { m = m, w= w };
foreach(var r in result)
{
var gegner = result.Where(c => c.m != r.m && c.w != r.w);
foreach(var tmpGegner in gegner)
{
Console.WriteLine($"{r} vs. {tmpGegner}");
}
}
Zitat
{ m = m1, w = w1 } vs. { m = m2, w = w2 }
{ m = m1, w = w1 } vs. { m = m2, w = w3 }
{ m = m1, w = w1 } vs. { m = m3, w = w2 }
{ m = m1, w = w1 } vs. { m = m3, w = w3 }
{ m = m1, w = w2 } vs. { m = m2, w = w1 }
{ m = m1, w = w2 } vs. { m = m2, w = w3 }
{ m = m1, w = w2 } vs. { m = m3, w = w1 }
...
{ m = m3, w = w1 } vs. { m = m2, w = w3 }
{ m = m3, w = w2 } vs. { m = m1, w = w1 }
{ m = m3, w = w2 } vs. { m = m1, w = w3 }
{ m = m3, w = w2 } vs. { m = m2, w = w1 }
{ m = m3, w = w2 } vs. { m = m2, w = w3 }
{ m = m3, w = w3 } vs. { m = m1, w = w1 }
{ m = m3, w = w3 } vs. { m = m1, w = w2 }
{ m = m3, w = w3 } vs. { m = m2, w = w1 }
{ m = m3, w = w3 } vs. { m = m2, w = w2 }
Ich hoffe es ist okay wenn ich hier kurz eine Frage genau zu diesem poste:
Angenommen ich habe Models (z.B. Order) und will davon Ableitungen haben (ProductOrder, ServiceOrder, etc.).
Sollte ich, wenn ich mit sowas arbeite direkt auf NoSQL Datenbanken setzen? Nachdem was ich gesehen habe würde es zwar mit EntityFramework & einem SQL Server gehen, aber sqlite und sowas nicht mehr?
Angenommen ich hätte einen Array mit Dateinamen von Bildern und ich will die geladenen Image Objekte z.B. mit GetAllImages() zurückgeben, bei sowas würde ich es dann einsetzen?
...
public IEnumerable GetAllImages()
{
...
yield return Image.FromFile(image[i]);;
}
Angenommen ich hätte eine Klasse die auf eine Datenbank zugreift:
// Pseudocode:
public class Datenbank
{
public IEnumerable GetArticles()
{
foreach...
yield return article;
}
// oder
public List<Article> GetArticles()
{
return articles;
}
}
Gibt es da irgendwelche Performancevorteile, bzw. wann sollte ich auf IEnumerable zurückgreifen anstatt z.B. der ganzen Liste? Wenn ich sehr speicherintensive Objekte habe?
da ich mit .NET Framework arbeite (.NET CORE gibts nicht mit Views oder?)
kann ich nur C# 7.3.
Ich weiss nicht ob mir das Buch da weiterhilft.
Ich gehe mal davon aus dass es zwischen Version 7.3 und 8 keine solchen fundamentalen Änderungen gibt, dass du damit überhaupt nicht mehr klar kommst Du kannst das Buch theoretisch auch mit einer uralt Version durch machen, alle Neuerungen der Versionen sind angeführt.
Es ist nirgendwo aufgeführt dass das Buch ausschließlich mit .NET Core arbeitet? Ich denke für dich würde das eh keinen merkbaren Unterschied bei der Entwicklung machen.
Wenn ich lernen will wie MVVM funktioniert, muss ich etwas haben woran/womit ich es lernen kann.
Bücher gibts keine gescheiten, YouTube?, Foren evtl. und! funktionierender Code den ich analysieren kann..
Ich arbeite derzeit das Buch C# 8 mit Visual Studio 2019: Das umfassende Handbuch von Andreas Kühnel durch, da wird auch MVVM behandelt. Ich kann das Buch wirklich auch für die Festigung grundlegender Kenntnisse empfehlen. Vorallem noch mal die ausführliche Einarbeitung in delegates und Events dürfte da einiges erklären.
Ist eigentlich ganz einfach. Wenn man irgendwann in der Lage ist, andere Leute oder Firmen in einem bestimmten Bereich zu beraten, dann merkt man das selbst. Und dann kann man sich selbständig machen (Freiberufler) oder eine Firma gründen.
Ja klar, aber selbst wenn du der Beste bist werden ja nicht automatisch Firmen auf dich zukommen, ich meine ehr wie man dann da die Kontakte knüpft / Anschluss findet. Ich schätze mal wenn du ein paar größere Projekte mal mitgemacht hast geht der Rest von alleine oder?
Mega cool, danke für den Einblick
Kannst du da ein paar Konferenzen empfehlen, die man einfach so besuchen kann? Also am besten für .NET, Softwareentwicklung,...
Wie hast du dann angefangen? Also ich schätze mal . erst normal in dem Bereich gearbeitet/Erfahrung gesammelt, usw.? Aber wie macht man dann den Schritt in die Selbstständigkeit? Hattest du die ersten Aufträge durch Kontakte, ehemalige Arbeitgeber,... oder wie bist da rein gekommen?
nur mal so aus Neugierde da es ja auch Firmen gibt die sich auf Beratung für die Softwareentwicklung in C# spezialisiert haben, etc.
Wie steigt man in diesem Bereich ein? Also als Selbständiger. Gibt es da von Microsoft Zertifizierungen oder kommt es da ehr auf die Erfahrung/vergangene Projekte an? Wenn ja, wie kommt man da rein bzw. wie fängt man an?
Ich muss nochmal kurz nerven,
jetzt wenn man ein bisschen was gemacht hat und auch mal selbst einen Command angelegt hat muss man schon sagen es ist irgendwie um einiges komfortabler als WinForms
Per DI injecte ich jetzt den Datenservice in das OrdersViewModel, darin habe ich mir zwei Commands angelegt:
public class OrdersViewModel : BaseViewModel
{
private List<OrderViewModel> _Orders = new List<OrderViewModel>();
private AvService _avService;
public ICommand ShowDetailsCommand { get; set; }
public ICommand UpdateOrderCommand { get; set; }
public OrderViewModel SelectedOrder { get; set; }
...
private void showDetails(OrderViewModel order)
{
// simple window
Window frmDetails = new Window();
frmDetails.Content = new OrderUserControl(this, order);
frmDetails.Show();
}
private Order UpdateOrder(Order order, OrderViewModel orderView)
{
order.Title = orderView.Title;
// ...
return order;
}
public OrdersViewModel(AvService avService)
{
this._avService = avService;
// ShowDetails Command, TODO Can execute
ShowDetailsCommand = new RelayCommand( p =>
showDetails(this.SelectedOrder)
) ;
UpdateOrderCommand = new RelayCommand(p =>
avService.UpdateOrder( this.UpdateOrder(
avService.GetOrders()
.Where( x=> x.OrderId == (p as OrderViewModel).Id)
.First(), (p as OrderViewModel))
)
);
}
Der ShowDetailsCommand ist an einen Button im MainWindow gebunden, der öffnet dann mein Usercontrol testweise in einem temporären Fenster.
Nun zum UpdateOrderCommand, der soll das geänderte OrderViewModel in der Datenbank speichern, dazu mappe ich die Änderungen des ViewModels auf die des Order-Models und speichere sie in der Datenbank.
Würde man das so machen dass dem UserControl die ViewModel Instanz übergeben wird oder würde man sich da ehr an ein Event dranhängen?
User-Control:
public partial class OrderUserControl : UserControl
{
private OrdersViewModel _orders;
private OrderViewModel _order;
public OrderUserControl(OrdersViewModel orders, OrderViewModel order)
{
InitializeComponent();
this._orders = orders;
this._order = order;
this.DataContext = new
{
order = _order,
orders = _orders
};
}
}
Der Artikel erklärts ja recht schön nur verstehe ich dann den Einbezug von Models nicht.
Meinst du z.B. ich injecte den avService in das OrdersViewModel und manage da drüber alles?
D.h. einmalig die Liste so initalisieren,
und dann über einen Command z.B. avService.CreateOrder() und davon ein ViewModel in die Collection geben? ==> Also dass das OrdersViewModel nochmal eine Schicht zw. Datenbank Service und GUI ist?
nur verstehe ich da jetzt nicht ganz den Unterschied:
var viewModels = models.Select(model => new ViewModel() { Data = model.Data });
Items = new ObservableCollection<ViewModel>(viewModels);
Du erstellst doch da auch nur eine neue ObservableCollection mit den ViewModels.
Der Code bei mir macht doch das gleiche oder habe ich einen Denkfehler?!
ordersView.Orders ist ja die ObservableCollection des OrdersViewModel (entspricht Company in deinem Artikel), und der füge ich die ViewModels der Models hinzu.
Sorry bin noch relativ frisch in der Materie und mir fehlt da ein bisschen der Überblick.
foreach (var order in this._avService.GetOrders())
{
this._ordersView.Orders.Add(new OrderViewModel(order));
}
public class OrdersViewModel : BaseViewModel
{
private ObservableCollection<OrderViewModel> _Orders = new ObservableCollection<OrderViewModel>();
public ObservableCollection<OrderViewModel> Orders
{
...
Hier hast du offensichtlich denn Sinn einer ObservableCollection nicht verstanden. Die ObservableCollection ermöglicht es, eine veränderbare Liste mit Daten an die View zu binden, damit diese sich bei Datenänderungen automatisch aktualisieren kann.
Das ist genau mein Problem,
wie komme ich von den Models auf eine ObservableCollection mit den ViewModels, sodass ich WPF auch effektiv nutze.
@Abt danke für die Links vielleicht erklärt sich ja dadurch dann meine Frage
Außerdem sollte die DB-Klasse (und auch die Logik-Schicht) nichts von ViewModels wissen, sondern du solltest Modelldaten dafür erzeugen und verwenden.
Die UI-Schicht erzeugt dann aus diesen Modelldaten die passenden ViewModel-Daten (generell ist es aber normal, daß die ObservableCollection<T> jedesmal wieder neu erzeugt wird, wenn sich die Daten ändern - evtl. kannst du aber ein Caching einbauen, wenn es performancemäßig relevant ist).
Ich hatte genau die gleiche Fragestellung wie der Threadsteller, da ich derzeit ein kleines Testprojekt in WPF mache:
der avService liefert mir die Models aus einer Datenbank (Order, Customer,...).
Der Konstruktur des OrderViewModels mappt sich die dann vom Model. (könnte man noch auslagern um Abhängigkeiten zu verringern)
Würde man das so machen oder gibt es da noch etwas eleganteres? Wenn ein Objekt bearbeitet wird triggere ich dann z.B. nur den avService.UpdateOrder(...) und refreshe das ganze?
public partial class MainWindow : Window
{
private AvService _avService;
private OrdersViewModel _ordersView = new OrdersViewModel();
public MainWindow()
{
InitializeComponent();
this._avService = new AvService("test.db");
refresh();
}
private void refresh()
{
this._ordersView.Orders.Clear();
foreach (var order in this._avService.GetOrders())
{
this._ordersView.Orders.Add(new OrderViewModel(order));
}
dgOrders.ItemsSource = this._ordersView.Orders;
}
}
public class OrdersViewModel : BaseViewModel
{
private ObservableCollection<OrderViewModel> _Orders = new ObservableCollection<OrderViewModel>();
public ObservableCollection<OrderViewModel> Orders
{
get { return _Orders; }
set
{
if (value != _Orders)
{
_Orders = value;
OnPropertyChanged(nameof(Orders));
}
}
}
}