Laden...

Kategorisierte Optionen (wie Kategorisierte Newsletter Angebote) in WPF

Erstellt von tastimur vor 13 Jahren Letzter Beitrag vor 13 Jahren 2.059 Views
T
tastimur Themenstarter:in
64 Beiträge seit 2007
vor 13 Jahren
Kategorisierte Optionen (wie Kategorisierte Newsletter Angebote) in WPF

Hallo zusammen,

was ist die eleganteste bzw empfohlene weg,
folgende Newsletter Angebote in WPF anzuzeigen bzw in SQL datenbank bewahren?
(Jeder Benutzer hat eigene ausgewählte Angebote).

Sport
[x] Fussball
[ ] Eishokey
[x] etc.
Wirtschaft
[x] Börse
[ ] ....

Danke Vorab.

Grüße

Timur Tas

3.430 Beiträge seit 2007
vor 13 Jahren

Hallo tastimur,

das hängt immer davon ab was du da genau anzeigen willst bzw. wie du es anzeigen willst.

Dein Beispiel sieht nach einer Liste aus.
Dafür ist die ListBox oder ComboBox geeignet.
Wenn es eher um eine tabellarische Darstellung geht dann ist das DataGrid oder ListView besser geeignet.

Da fast alle Controls DataBinding unterstützen kannst du einfach die daten von der Datenbank laden und an die GUI binden

Gruss
Michael

5.742 Beiträge seit 2007
vor 13 Jahren

folgende Newsletter Angebote in WPF anzuzeigen

Tja - da gibt es viele Möglichkeiten, wie ja michlG schon gesagt hat 🙂
Das naheliegenste wäre IMHO ein ListView (evtl. gruppiert nach Thema) mit CheckBoxen. Auch ein DataGrid ist denkbar. Oder du verwendest eine Liste mit Drag&Drop, oder....
Im Idealfall führst du da ein paar Usability-Tests durch, um herauszufinden, was deine User bevorzugen.

bzw in SQL datenbank bewahren

Das ist jetzt eigentlich eine vollkommen andere Frage.
Erstelle die lieber in Datentechnologien neu (oder google besser vorher nochmal ein bisschen - Tipp: Eine Tabelle mit den Usern, eine mit den Newslettern und eine Tabelle für die Mappings)

T
tastimur Themenstarter:in
64 Beiträge seit 2007
vor 13 Jahren

hallo michlG,

danke für die schnelle Antwort.

ich wollte wissen wie ich diese Kategorien und Optionen
und von Benutzer ausgewählte Optionen in Datenbank speichern
soll und dann in welcher Form die Daten abholen soll damit ich die
an meine WPF Control bzw Window (eigentlich egal, aber besser nur Textblocks für Kategorien
und CheckBoxes für darunter liegenden Optionen)
binden kann.

Grüße

Timur Tas

1.044 Beiträge seit 2008
vor 13 Jahren

Hallo tastimur,

ich würde so vorgehen: Eine Klasse _Item _beinhaltet zwei Properties. Ein Property mit dem Namen _Description _und eine andere Property mit dem Namen IsChecked. Im Code-Behind legst du eine ObservableCollection<Item> an. Zu der Liste fügst du die einzelnen Sachen hinzu. Beachte dabei, dass _IsChecked _natürlich auf false gesetzt sein muss. Die Daten bindest du an ein Control. Hier würde sich z.B. eine ListBox anbieten. Durch das INotifyPropertyChanged-Interface bekommst du dann die Eingaben mit. So kannst du dann immer über die Liste auf die Daten zugreifen.

Siehe auch Data Binding Overview.

zero_x

T
tastimur Themenstarter:in
64 Beiträge seit 2007
vor 13 Jahren

nochmal danke an euch

ich vesuche es nochmal zu formulieren. Ich habe meine Frage schlecht definiert.


 public class NewsletterItem
    {
        public int NewsletterItemID { get; set; }
        public string NewsletterItemName { get; set; }
        public string Description { get; set; }
    }
    public class NewsletterGroup
    {
        ObservableCollection<NewsletterItem> DispatchTypes { get; set; }
        public int NewsletterGroupID { get; set; }
        public string NewsletterGroupName { get; set; }
        public string GroupDescription { get; set; }
    }
// und sagen wir mal für jeder Benutzer hole ich ausgewählte Angebote
//aus der datenbank.
    public ObservableCollection<int> SelectedNewsletter;

meine Idee war HierarchicalDataTemplate zu benutzen. Ich weis aber nicht, in welcher Form ich die obigen classen bringen soll damit ich geschickt an meine
window bzw UserControl oder HierarchicalDataTemplate binden kann.

Danke nochmal an euch.

Grüße

Timur Tas

5.299 Beiträge seit 2008
vor 13 Jahren

wenn ich deine Eingangsfrage recht verstehe, braucht NewsletterItem eine bool Property, und muß INotifyPropertyChanged implementieren.

Der Getter dieser Prop könnte zB. SelectedNewsletter.Contains(this) returnen, und der Setter würde this entweder adden oder removen, je nachdem.

Der frühe Apfel fängt den Wurm.

U
1.578 Beiträge seit 2009
vor 13 Jahren

"NewsLetterItemName" und "NewsletterItemID" kannst du kürzen zu "Name" und "ID",
"Newsletter" ist das Item bereits, sind also Redundante Informationen

2.
Ich würde an deiner Stelle keine Newsletter Gruppen erstellen, eher die Information zu welcher Gruppe ein Newsletter gehört in form eines Properties, und dann einfach die Liste selbstständig danach Gruppieren lassen.

3.
Zum Thema Speichern und Laden
Da reichen schon Wenige Informationen, z.b.
Tabelle 1: NewsLetters: Id, Name, Description, GroupName
Tabelle 2: Users: Name, NewsLetterIds

Lange Rede gar kein Sinn, hier mal Pseudocode:

public class Newsletter : INotify....
{
    public int ID { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public string GroupName { get; set; }
    public bool IsSelected { get; set; }
}
public class User : INotify....
{
    public string Name { get; set; }
    public ObservableCollection<Newsletter> Newsletters { get; set; }
}

Nun baust du dein Fenster auf
Wir gehen davon aus das du bereit ein User hast (Wie das bei dir aufgebaut ist wissen wir ja nicht).

D.h. du gibst den User alle vorhandenen Newsletter in seiner "Newsletters" Collection und setzt alle auf "IsSelected" die vorher schon ausgewählt waren.

Diese Liste von Newslettern bindest du an eine ListView, in den CellTemplates erstellst du dann entsprechend CheckBox.IsSelected gegen den IsSelected, und TextBlock.Text gegen Name und noch ein TextBlock.Text gegen Description.
Zudem definierst du eine GroupDescription und lässt die Gruppen nach den GroupName erstellen, das lässt du dann auch im GroupTemplate entsprechend anzeigen.
Nachdem der Benutzer das Fenster schloss, schmeißt du einfach alle !IsSelected aus der Newsletters Collection und du kannst den User neu abspeichern.

Hier auch mal Pseudo davon:

<Window ...
        xmlns:ComponentModel="clr-namespace:System.ComponentModel;assembly=WindowsBase">
        ...>
    <Window.Resources>
        <CollectionViewSource x:Key="Newsletters" Source="{Binding Newsletters}">
            <CollectionViewSource.GroupDescriptions>
                <PropertyGroupDescription PropertyName="GroupName" />
            </CollectionViewSource.GroupDescriptions>
            <CollectionViewSource.SortDescriptions>
                <ComponentModel:SortDescription PropertyName="Name" Direction="Ascending" />
            </CollectionViewSource.SortDescriptions>
        </CollectionViewSource>
    </Window.Resources>

    <ListView ItemsSource="{Binding Source={StaticResource Newsletters}}">
        <ListView.GroupStyle>
            <GroupStyle>
                <GroupStyle.ContainerStyle>
                    <Style TargetType="{x:Type GroupItem}">
                        <Setter Property="Margin" Value="0,0,0,5" />
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate TargetType="{x:Type GroupItem}">
                                    <StackPanel>
                                        <TextBlock FontWeight="Bold" Text="{Binding Name}" Margin="5,0" Foreground="Blue" />
                                        <ItemsPresenter />
                                    </StackPanel>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </GroupStyle.ContainerStyle>
            </GroupStyle>
        </ListView.GroupStyle>
        <ListView.View>
            <GridView>
                <GridViewColumn>
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <CheckBox IsChecked="{Binding IsSelected}" />
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
                <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}" />
                <GridViewColumn Header="Description" DisplayMemberBinding="{Binding Description}" />
            </GridView>
        </ListView.View>
    </ListView>
</Window>
T
tastimur Themenstarter:in
64 Beiträge seit 2007
vor 13 Jahren

vielen dank an alle.

danke David. Deine Antwort hat mir viel geholfen.