Guten Abend,
ich hab mal wieder eine Frage. Suche da jetzt schoon den ganzen Abend nach und komme leider zu keinem Ergebnis 😦
Ich habe mir mit XAML-Code quasi eine Art "Kasten" gebaut. Mit einer Überschrift, einem Close-Button und einer Liste:
<Border Width="200" Height="300"
Canvas.Left="200" Canvas.Top="100"
Background="{StaticResource Brush_HeaderBackground}"
CornerRadius="10">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="30" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<DockPanel Grid.Row="0">
<Button Content="X"
Cursor="Hand"
DockPanel.Dock="Right"
Focusable="False"
FontFamily="Courier"
FontSize="9"
FontWeight="Bold"
Margin="0,0,5,0"
Padding="0"
VerticalContentAlignment="Bottom"
Width="16" Height="16"
/>
<TextBlock Text="DBTMain"
Foreground="White"
FontWeight="Bold"
Margin="5,0,0,0"
VerticalAlignment="Center"
/>
</DockPanel>
<ListView Grid.Row="1"
Margin="5,0,5,5"
BorderBrush="Black"
BorderThickness="2">
</ListView>
</Grid>
</Border>
Was will ich damit machen? Ich habe eine Liste mit verschiedenen Namen. Diese Namen kann der Benutzer per Drag and Drop auf einen Canvas-Bereich ziehen und beim los lassen soll die Box erstellt werden. Ich müsste also diese Box dynamisch im CodeBehind erstellen. Mein Problem ist, ich weiß nicht wie ich das machen kann:
Am liebsten würde ich ein Style als XAML in den UserControl.Resources oder in einem Dictionary erstellen und den Style beim erstellen der Liste im CodeBehind hinzufügen. Wie ich das Style im CodeBehind hinzufüge habe ich schon herausgefunden, wie ich allerdings das Design erstellen kann, sodass die Box mir so angezeigt wird, finde ich leider nicht heraus.. 😦 Habt ihr da ein paar Tipps für mich?
Die zweite Alternative wäre das ganze Ding in einer Funktion im CodeBehind zu erstellen. Was allerdings etwas umständlicher wäre.
Ich weiß, wahrscheinlich kann man auch meine Idee irgendwie mit MVVM lösen. Werde ich auch noch machen, aber erstmal will ich das ganze mit dem Drag und Drop + erstellen der Box mit dem Style und nooch ein paar andere Funktionen verstehen.. das ist für mich als Anfänger schon schwierig genug 😄 Aber langsam nimmt das alles Formen an..
Vielen Dank schonmal
Habe die Lösung nach einer Nacht drüber schlafen selbst gefunden.
Für die, die soowas evtl. auch mal benötigen: Ich wusste noch nicht, dass man auch ganze Controls in den Ressourcen ablegen kann.
Man gibt dem Control einen x:Key-Namen und kann darauf dann mit FindResource im CodeBehind zugreifen.
Wichtig war aber noch, dass man in dem Control das x:Shared Property auf False setzt, da ansonsten eine Exeption ausgelöst wird wenn man versucht die Box 2 mal dem Bereich hinzuzufügen..
MfG Jac
Wiedermal ich.. 😄
Habe dann doch noch eine Frage zu diesem Thema "Problem" an dem ich die letzten Tage sitze. Ich versuche das mal kurz zu erklären:
Ich benutze für ein View die CodeBehind-Datei. Das mache ich, weil dieser Code definitiv zum View gehört und nicht in ViewModels ausgelagert werden muss.
In diesem Code habe ich eine Liste mit Tabellennamen einer Datenbank. Die Tabellen kann ich dann per Drag & Drop auf ein Canvas ziehen, worauf hin eine weitere Liste geöffnet wird mit allen Namen.
Für die "Box", die ich in das Canvas ziehen kann, verwende ich ein vordefiniertes Control in einem DictionaryResource.xaml - Wie weiter oben schonmal angedeutet. Das sieht nun aber so aus:
<Border x:Key="DraggedBox"
x:Shared="False"
Width="200" Height="300"
Canvas.Left="200" Canvas.Top="100"
Background="{StaticResource Brush_HeaderBackground}"
BorderBrush="Black"
BorderThickness="1"
CornerRadius="10">
<Grid x:Name="DraggedGrid">
<Grid.RowDefinitions>
<RowDefinition Height="30" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<DockPanel Grid.Row="0">
<Button Content="X"
Cursor="Hand"
DockPanel.Dock="Right"
Focusable="False"
FontFamily="Courier"
FontSize="9"
FontWeight="Bold"
Margin="0,0,5,0"
Padding="0"
VerticalContentAlignment="Bottom"
Width="16" Height="16"
/>
<TextBlock Text="DBTMain"
Foreground="White"
FontWeight="Bold"
Margin="5,0,0,0"
VerticalAlignment="Center"
/>
</DockPanel>
<ListView Grid.Row="1"
x:Name="DraggedList"
Margin="5,0,5,5"
BorderBrush="Black"
BorderThickness="2">
<ListView.View>
<GridView>
<GridView.ColumnHeaderContainerStyle>
<Style TargetType="{x:Type GridViewColumnHeader}">
<Setter Property="HorizontalContentAlignment" Value="Left" />
</Style>
</GridView.ColumnHeaderContainerStyle>
<GridViewColumn>
<GridViewColumn.CellTemplate>
<DataTemplate>
<CheckBox Checked="{Binding}"></CheckBox>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="Name" TextBlock.TextAlignment="Left" />
</GridView>
</ListView.View>
</ListView>
</Grid>
</Border>
In der Code-Behind-Datei reagiere ich also auf das Droppen in dem Canvas. Suche mir mit "FindResource" die DraggedBox und setze auf das ItemSource der Liste eine gefüllte Liste, sodass ich in der Box alle Spalten aus der Tabelle angezeigt bekomme. Im Prinzip ähnlich wie der MSSQL-Server funktioniert.
Jetzt mein Problem, bei dem ich Hilfe benötige:
Wie ihr im XAML-Code seht, befindet sich in der vordefinierten Liste eine CheckBox. Ich möchte eigentlich nur wissen, wie ich dort (ohne MVVM, sondern so wie ich es jetzt nun gemacht habe) auf ein "Checked-Event" reagieren kann. Mein Plan war eigentlich, dass ich per Programmcode dem Event "Checked" an eine Methode knüpfe (heißt glaube ich abonnieren?). Allerdings finde ich zum Teufel nicht raus, wie ich in der vordefinierten Box an die Checkboxen komme um dort an das Event etwas anzuhängen. Kann mir dort evtl. jemand einen Tipp geben?
Nur zur Erklärung: Mir ist bewusst, dass dieses Vorgehen nicht MVVM-Konform ist. Ich wüsste wahrscheinlich sogar wie ich das alles umbaue, sodass es per ViewModel und Binding funktioniert. Ich wollte es aber gerne mal auf diesem Weg machen, da das immernoch mein "Lernprogramm" ist und ich mal schauen wollte ob sowas auch möglich ist.
Also entweder das Problem ist total "bescheuert" oder ich hab es so unverständlich erklärt, dass keiner drauf antworten möchte 8o
Was trifft zu? 😁
Gib der CheckBox einen Namen und ruf Control.FindName auf. Dort dann entsprechend das Event registrieren.
Edit:
Unnötig, da das Event auch in dem Template definiert werden kann. Falls der beschriebene Weg genutzt werden sol, das Control als ControlTemplate definieren, da sonst FindName nicht funktioniert.
Hi Jacyrio,
nachdem ich mir jetzt gefühlte 10 Seiten Problembeschreibung durchgelesen habe, bleibt eigentlich nur die Frage übrig, wie man einen Ereignishandler an ein Event der Checkbox bindet.
Ich finde es übrigens extrem unhöflich, kurz vor dem Schlafengehen einen riesigen Text zu posten, anstatt einfach nocheinmal darüber nachzudenken, wenn man ausgeschlafen ist.
Genauso unhöflich ist es, dann auch noch zu drängeln und zu pushen, wenn du innerhalb eines Tages keine Antwort bekommen hast. Die Leute hier im Forum helfen dir gerne, aber du mußt dich an bestimmte Regeln halten, siehe auch [Hinweis] Wie poste ich richtig? (besonders Punkt 1, 4, 5 und 7).
Dein grundlegendes Problem ist allerdings eher der fehlenden Trennung der Schichten und der Verantwortlichkeiten geschuldet. Wenn du in deinem Codebehind der View eine Liste mit Tabellennamen usw. hast, dann solltest du unbedingt View, Logik und Datenzugriffe trennen, siehe dazu auch zur Einführung: [Artikel] Drei-Schichten-Architektur.
Außerdem ist es mir ein Rätsel, warum du solchen Wert darauf legst, kein MVVM zu verwenden. Gerade in der Lernphase wäre es doch vorteilhaft, gleich die richtige Herangehensweise zu verwenden, anstatt auf Biegen und Brechen die falsche Herangehensweise.
Ich würde dir daher unbedingt empfehlen, deinen Code so zu überarbeiten, daß die einzelnen Einheiten getrennt voneinander funktionieren und getestet werden können, dann erübrigen sich auch solche langen und unnötigen Problembeschreibungen wenn es irgendwo einen Fehler gibt.
Christian
Weeks of programming can save you hours of planning
Hello MySparkle..
unhöflich finde ich eher einige Leute in diesem Forum, die einem helfen wollen und dabei einen behandeln als sei man total neben der Kappe.. im Gegensatz zu anderen Foren bekomme ich hier überwiegend patzige Antworten. Schade, dass das hier das einzige Forum mit vielen Leuten ist wo ich zum Thema WPF Hilfe bekomme..
Ich finde es interessant, dass man in diesem Forum fast jedesmal behandelt wird, als müsste man (auch als Anfänger) schon immer WPF programmiert haben und muss immer sofort den richtigen Weg wählen.. das man als Anfänger auch mal einen falschen Weg wählt scheint hier wohl nicht erlaubt.. Ist mir auch schon in einigen anderen Themen aufgefallen, die nichts mit mir zu tun hatten 😉
Zu deinem Thema das ich angeblich unhöflich wäre: Ich poste hier nicht rein ohne vorher LANGE selbst zu versuchen mein Problem zu lösen. Auch vor meiner letzten (anscheinend zulangen) Problembeschreibung habe ich viele Stunden damit verbracht herauszufinden wie ich alleine auf die Lösung komme.. da ich nicht weiterkam, hab ich das hier als Frage gestellt.. ich konnte leider nicht hellsehen das ich den nächsten Tag hier her komme, noch keine Antwort hatte, weiter versuche mein Problem zu lösen und dann auch noch auf die Lösung komme.. sorry
Zu meiner anderen Unhöflichkeit: Ich bin kein Mensch der in Foren drängelt. Da aber schon auf meine letzte Frage keine Antwort kam und hier bisher realtiv schnell die Fragen beantwortet wurden, dachte ich, ich stelle evtl. die Frage falsch.
Wieso ich versuche das alles auf dem anderen Weg zu machen, der vielleicht nicht typisch MVVM ist? Weil ich irgendwo in einem Thread gefragt habe, ob es eigentlich in Ordnung ist auch etwas in die CodeBehind-Datei zu packen, oder ob sowas garnicht erlaubt ist. Die Antwort war, dass es in Ordnung ist, solange Code und UI untrennbar zusammen gehören. Das tun sie in diesem Fall. Also habe ich mir gedacht ich mache es auf diesem Weg.
Nochmal: Ich bedanke mich für die Hilfe, auch in anderen Threads.. aber auch die Personen, die einem helfen wollen, einem die Forenregeln um die Ohren hauen und anscheinend sogar in dem Forum etwas mehr zu sagen haben sollten sich mal an die eigene Nase fassen und Anfänger etwas freundlicher behandeln... andere Personen (wie t0ms3n - Danke auch dir an dieser Stelle!) können das ja anscheinend auch..
MfG Jac
Hi Jacyrio,
sorry, aber wenn du so darauf reagierst, daß sich Leute die Zeit nehmen, deine ellenlangen Texte durchzulesen und versuchen, dir bei deinem Problem zu helfen, dann solltest du dir wirklich überlegen, ob die Software-Entwicklung das Richtige für dich ist.
Was ist das überhaupt für ein Anspruch, daß du so selbstverständlich erwartest, daß man dir hier kostenlos mit deinen Problemen weiterhilft, und zwar schnell?
Anstatt dich darüber zu beschweren, daß es hier nicht schnell genug geht, hättest du z.B. auf die oben genannten Punkte eingehen können. Dann könnte man dir auch bei deinem konkreten Problem weiterhelfen.
Alles andere ist bereits in unseren Community-Regeln und [Hinweis] Wie poste ich richtig? geregelt.
Christian
Weeks of programming can save you hours of planning