Datagrid - Enum als Checkboxen representieren

  • WPF

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von fichz.

    Datagrid - Enum als Checkboxen representieren

    yo Leute,

    ich habe eine kleine Blockade oder einen falschen Ansatz. Ich habe eine Modelklasse welche ein Training (Handball) repräsentiert. Hierbei wird gespeichert ob ein Spieler Anwesend, Entschuldigt oder Unentschuldigt war.
    Spoiler anzeigen

    C#-Quellcode

    1. public class TrainingPresent
    2. {
    3. public int TrainingPresentId { get; set; }
    4. public PlayerPresent PlayerPresent { get; set; }
    5. public int PlayerId { get; set; }
    6. public Player Player { get; set; }
    7. public int TrainingId { get; set; }
    8. public Training Training { get; set; }
    9. }
    10. public enum PlayerPresent
    11. {
    12. Present = 1,
    13. Excused = 2,
    14. Unexcused = 3
    15. }



    Ich will nun in einem Datagrid es so darstellen, dass in Spalte 1 der Name (von Player) dargestellt wird und in den Spalte 2-4 jeweils Chechboxspalten mit Anwesend, Entschuldigt oder Unentschuldigt.
    Nun soll aber wenn eine der 3 Checkboxen geklickt wird, die anderen abmarkiert werden (RadioButton Stil), weil man kann ja nicht anwesend und unentschuldigt gleichzeitig sein.

    Wie kann ich das in XAML bzw im Viewmodel korrekt abhandeln?
    Der interessante XAML Bereich:
    Spoiler anzeigen

    XML-Quellcode

    1. <DataGrid ItemsSource="{Binding SelectedTraining.TrainingPresents}" AutoGenerateColumns="False" Grid.Row="1" CanUserAddRows="False">
    2. <DataGrid.Columns>
    3. <DataGridTextColumn Header="Name" Width="2*">
    4. <DataGridTextColumn.Binding>
    5. <MultiBinding StringFormat="{}{0} {1}">
    6. <Binding Path="Player.FirstName" />
    7. <Binding Path="Player.LastName" />
    8. </MultiBinding>
    9. </DataGridTextColumn.Binding>
    10. </DataGridTextColumn>
    11. <DataGridCheckBoxColumn Header="Anwesend" Width="*"/>
    12. <DataGridCheckBoxColumn Header="Entschuldigt" Width="*"/>
    13. <DataGridCheckBoxColumn Header="Unentschuldigt" Width="*"/>
    14. </DataGrid.Columns>
    15. </DataGrid>



    Im ViewModel gibt es eine ObservableCollection von Training und eine Property SelectedTraining welches das ausgewählte Training repräsentiert. Innerhalb des Training gibt es wieder eine ObservableCollection von TrainingPresent Einträgen welche ich darstellen will.

    PS: Es soll keine ComboboxSpalte sein.

    lg
    Bilder
    • DataGrid.JPG

      16,33 kB, 758×70, 117 mal angesehen
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    Wie wäre es, wenn du Radiobuttons zu einer Radiobuttongruppe zusammenfügt, nämlich das Binding der Gruppe auf den Namen des Spielers. Dann sollte immer nur einer aktviertbar sein. War gerade mein Gedanke beim lesen.

    Quellcode

    1. <RadioButton GroupName="{Binding Spielername}" IsChecked="{Binding BoolescheVariable}"/>
    So um den Thread hier abzuschließen hatte ich nun 2 Möglichkeiten.
    Die eine war es über einen Converter zu lösen welche einen Parameter des jeweiligen Enum Typs hatte. Das hatte aber den Nachteil, dass die anderen nicht geändert wurden, also 2 gecheckt waren.

    Somit blieb ich bei Version 2 und murkse das Ganze nun in eine einzelne Spalte.

    XML-Quellcode

    1. <DataGridTemplateColumn Width="*" Header="Anwesendheitsstatus" >
    2. <DataGridTemplateColumn.CellTemplate>
    3. <DataTemplate>
    4. <StackPanel Orientation="Horizontal" >
    5. <RadioButton Content="Anwesend" Margin="3" IsChecked="{Binding PlayerPresent, Converter={StaticResource enumBooleanConverter}, ConverterParameter=Present, Mode=TwoWay, UpdateSourceTrigger=LostFocus}" />
    6. <RadioButton Content="Entschuldigt" Margin="3" IsChecked="{Binding PlayerPresent, Converter={StaticResource enumBooleanConverter}, ConverterParameter=Excused, Mode=TwoWay, UpdateSourceTrigger=LostFocus}" />
    7. <RadioButton Content="Unentschuldigt" Margin="3" IsChecked="{Binding PlayerPresent, Converter={StaticResource enumBooleanConverter}, ConverterParameter=Unexcused, Mode=TwoWay, UpdateSourceTrigger=LostFocus}" />
    8. </StackPanel>
    9. </DataTemplate>
    10. </DataGridTemplateColumn.CellTemplate>
    11. </DataGridTemplateColumn>


    Den "EnumToBooleanConverter" hab ich von stackoverflow.com/questions/39…d-radiobuttons-to-an-enum
    Den UpdateSourceTrigger musste ich auf LostFocus anstatt auf PropertyChanged setzen, da ich sonst im Model auf INotityPropertyChanged implementieren müsste, was ich jedoch soweit vermeiden will.

    Falls jemand eine bessere Lösung parat bin ich natürlich offen, obwohl ich mit dieser hier ganz zufrieden bin.

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    @ErfinderDesRades nein nicht unbedingt. Also automatisch kann ichs nur vom Entity Framework sagen, dass es nicht automatisch implementiert wird. Ist im Prinzip auch nicht notwendig, da ja eh das ViewModel die Schnittstelle ist (und auch INotifyPropertyChanged implementiert).

    Es scheiden sich die Geister ob man es im Model auch implementieren soll. Der eine meint so der andere so. Für mich persönlich wäre es prinzipiell egal, jedoch hab ich halt doppelte Arbeit es einerseits im ViewModel als auch im Model zu implementieren.

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten