Laden...

Radio Buttons im Datagrid

Erstellt von liberado vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.803 Views
L
liberado Themenstarter:in
273 Beiträge seit 2006
vor 12 Jahren
Radio Buttons im Datagrid

Hallo,
ich habe aktuell ein großes Problem. Ich möchte in einem Datagrid einfach 3 Radiobuttons in 3 Spalten haben. Die werte sind "schnell" , "langsam", "normal".

Von den 3 Radiobuttons darf jeweils nur einer ausgewählt sein. Das ganze mit MVVM. Im viewmodell hab ich dafür 3 boolsche Werte.
Kann mir jemand helfen wie ich das umsetze ?

Vielen Dank und Gruß

Liberado

1.552 Beiträge seit 2010
vor 12 Jahren

Hallo liberado,

wo ligt das Problem? RadioButtons lassen sich in derselben Gruppe, sprich mit demselben GroupName generell nur 1x auswählen. Welcher Wert nun an IsChecked in MVVM gebunden wird, entscheidest du schlussendlich dann im ViewModel, bzw im Converter.

Gruß
Michael

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

L
liberado Themenstarter:in
273 Beiträge seit 2006
vor 12 Jahren

ja genau das ist mein Problem.
Was muss den der Groupname sein ?Muss das auch ein Viewmodel sein ? kannst du mir da vielleicht mal ein Beispiel zeigen ?

6.862 Beiträge seit 2003
vor 12 Jahren

Hallo,

wie wärs mit Doku lesen wie in [Hinweis] Wie poste ich richtig? Punkt 1.1 gefordert?

Baka wa shinanakya naoranai.

Mein XING Profil.

1.552 Beiträge seit 2010
vor 12 Jahren

Du kannst entweder,


<RadioButton IsChecked="{Binding Path=IsRB1}"/>
<RadioButton IsChecked="{Binding Path=IsRB2}"/>
<RadioButton IsChecked="{Binding Path=IsRB3}"/>

und dann die IsRBX in deinem ViewModel hinterlegen, sodass immer nur eine Property dieser 3 true ist, oder du erstellst einen Converter, mit welchem du dann machst:


<RadioButton IsChecked="{Binding Path=IsRB1, Converter={StaticResource TestConverter}" ConverterParameter="langsam"/>
<RadioButton IsChecked="{Binding Path=IsRB2, Converter={StaticResource TestConverter}" ConverterParameter="normal"/>
<RadioButton IsChecked="{Binding Path=IsRB3, Converter={StaticResource TestConverter}" ConverterParameter="schnell"/>

und dementsprechen im Converter auf den ConverterParameter reagierst,
oder du erstellst eine, was m.E. das einfachste und logischste wäre, eine ComboBox.

Dies sind alles Anstöße welche dir weiterhelfen sollten das Problem eigenständig zu lösen.

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

L
liberado Themenstarter:in
273 Beiträge seit 2006
vor 12 Jahren

Hallo,
ja soweit war ich schon, das funktioniert auch. Aber hier habe ich alle 3 Radio-buttons in einer Spalte. Und ich will die Radio-buttons in 3 Spalten haben und da funktioniert leider nicht mehr.

1.552 Beiträge seit 2010
vor 12 Jahren

Das Problem bei den RadioButtons ist, dass sie logisch gruppiert werden je nach dem in welchem Content sie liegen. Sprich, wenn ich 4 Radiobuttons habe die wie folgt liegen:

<StackPanel>
    <RadioButton Name="RB1"/>
    <StackPanel>
        <RadioButton Name="RB2"/>
        <RadioButton Name="RB3"/>
    </StackPanel>
    <StackPanel>
        <RadioButton Name="RB4"/>
    </StackPanel>
</StackPanel>

so lässt sich in dieser Situation RB1 und (RB2 oder RB3) und RB4 auswählen.
Wollte ich jetzt dass zwischen RB4 und RB1 eine Beziehung bestünde, und dadurch nur eines von beiden auswählbar sei, müsste ich diesen beiden, da sie nicht in derselben Content liegen, explizit den Gruppennamen über GroupName geben. Welcher dieser nun ist, ist komplett egal, wichtig ist nur dass er bei beiden derselbe ist.

Dasselbe ist bei dem GridView.

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

L
liberado Themenstarter:in
273 Beiträge seit 2006
vor 12 Jahren

Vielleicht hab ich mir nicht richtig ausgedrückt.
Also das mit dem GroupName funktioniert einfach nicht richtig. Ich kann auch ZEILENÜBERGREIFEN nur einen Radiobutton auswählen.
Ich habe das Datagrid auf eine Observable-Collection gebunden. Wenn ich nun eine neue Zeile hinzufüge kann ich zeilenweise sowie zeilenübergreifen nur einen Radiobutton auswählen.
beispiel ich wähle in der ersten Zeile einen radiobutton aus. Danach einen in der zweiten. -> der in der ersten Zeile verschwindet wieder!

1.552 Beiträge seit 2010
vor 12 Jahren

Ok, das stimmt, da hast du recht.
Generell würde ich jedoch alles im ViewModel lösen, denn dieses wendest du auch an.
Du hast dann ein ViewModel welches die ItemListe beinhaltet und dann diese Liste beihnaltet wiederum ViewModels welche die entsprechenden eigenschaften wie IsSchnell, IsLangsam, IsNormal anbietet, oder deren Werte wie bereits genannt durch einen Converter richtig Convertiert werden. Z.b. kannst du anstelle von 3 Eigenschaften IsSchnell, IsLangsam, IsNormal ein Enum erstellen welches die 3 Werte Schnell, Langsam, Normal beinhaltet. Durch den Converter ist dann je nach Wert der entsprechende RadioButton ausgewählt oder nicht.

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

L
liberado Themenstarter:in
273 Beiträge seit 2006
vor 12 Jahren

ok vielen Dank schonmal für den Tip mit dem Enum. Ich hab noch nie einen Converter geschrieben. Werd mir das jetzt mal ansehen 😃
Kann ich dann im converter direkt auf das viewmodel zugreifen ?
Gruß

1.552 Beiträge seit 2010
vor 12 Jahren

Kann ich dann im converter direkt auf das viewmodel zugreifen ?

Nein, aber du kannst alles notwendige mitgeben wenn du es z.b. so machst:


<RadioButton IsChecked="{Binding Path=EnumPropertyImVM, Converter={StaticResource TestConverter}}" ConverterParameter="{x:Static XMLSNamespace:Speed.Slow}"/>
<RadioButton IsChecked="{Binding Path=EnumPropertyImVM, Converter={StaticResource TestConverter}}" ConverterParameter="{x:Static XMLSNamespace:Speed.Normal}"/>
<RadioButton IsChecked="{Binding Path=EnumPropertyImVM, Converter={StaticResource TestConverter}}" ConverterParameter="{x:Static XMLSNamespace:Speed.Fast}"/>

dementsprechend hast du dann im IValueConverter in der Convert Methode als value dein EnumPropertyImVM und als parameter deinen ConverterParameter. Dementsprechen kannst du dann den Wert setzten.
Da du durch ein setzen des Wertes in der GUI, die EnumPropertyImVM direkt beinflusst, sollte das ConvertBack auch implementiert sein.
Wie das mit den Convertern so funktioniert siehst du unter IValueConverter

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

L
liberado Themenstarter:in
273 Beiträge seit 2006
vor 12 Jahren

Guten Morgen,
also ich habe jetzt alles so gemacht, aber nun kommt mein nächstes Problem. Wenn ich den RadioButton klicke wird mein Setter im Viewmodell nicht aufgerufen. Der Wert ändert sich einfach nciht.
Was könnte den das sein ?
Wenn ich die Radiobuttons ausserhalb des Datagrid habe klappt alles. Innerhalb eines Datagrids wird mein Setter nicht aufgerufen.
Gruß

1.552 Beiträge seit 2010
vor 12 Jahren

Hallo liberado,

ich denke dass es dir an Grundkenntnissen von WPF und Binding fehlt. Jedes fehlgeschlagene Binding wird dir im Output Window angezeigt. Hier ein Beispiel:

class MainViewModel
{
    IEnumerable<MyClass> List;
    string Value
}
class MyClass
{
    Speed Speed;
}

<TextBox Text="{Binding List}"/> <!--Hier wird an MainViewModel gebunden-->
<GridView>
    <GridView.Colums>
         <WasAuchImmerColumn Content="{Binding Speed}"/> <!--Hier wird an MyClass gebunden-->
         <WasAuchImmerColumn Content="{Binding Value}"/> <!--FEHLER, Value gibt es in MyClass nicht-->
    <GridView.Columns>
</GridView>

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

L
liberado Themenstarter:in
273 Beiträge seit 2006
vor 12 Jahren

Hat sich nun erledigt.
Mein Fehler war das ich beim binding UpdateSourceTrigger=PropertyChanged
vergessen hatte. Muss man bei Checkboxen und RadioButtons machen.
Danke für eure Hilfe.
Gruß