C# DataContext per ButtonClick festlegen

PapstRatze

Lt. Junior Grade
Registriert
Aug. 2008
Beiträge
436
Hey ich mal wieder und immer noch bin ich bei den DataBindings ;). Ich habe diesmal ein Programm, welches einen Timer Darstellt z.B für eine Präsentation. Dafür müssen zuerst die verschiedenen Vorträger mit deren Vortragszeiten erstellt werden (siehe Bild).

Mein Ziel ist es, da ich ja dabei bin DataBindings zu lernen/verstehen möglichst viel darüber zu machen und so würde ich gerne dem Stackpanel, in dem die TextBoxen mit Min und Sek sind als Datenkontext die ausgewählte Zeitspanne zuweisen. (Da TimeSpanXY.Minute nur gelesen werden kann, habe ich mir dafür sinnfreier weise schlicht und schnell eine eigene Klasse erstellt.)

In meiner Eigentlichen Klasse gibt es eine Liste mit diesen Vorträgen, wenn ich im Programm auf + klicke soll ein neuer Vortrag der Liste hinzugefügt werden und aktiv gesetzt werden. Also der Datenkontext des Stackpanels sollte nun auf diese Instanz der Klasse Vortrag zeigen (für den Fall das ich andere bearbeiten möchte, klicke ich auf entsprechende Zahl und wieder soll der Datenkontext geändert werden.)

Und da hakt es, ich habe keine Ahnung wie ich das anstellen soll, ich bin für jeden Tipp Dankbar. (Oder bin gezwungen dies im CodeBehind erledigen zu lassen?)
Anbei Bild und Codeausschnitte, wo man auch erkennen kann, dass ich das ganze vorher nicht wirklich durchdacht hatte :D

Ausschnitt aus XAML:
Code:
<Window ...
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        xmlns:local="clr-namespace:Timer" ...>

    <Window.Resources>
        <ObjectDataProvider x:Key="SelectedTime"
                            ObjectType="{x:Type local:Mitglied}"
                            MethodName="getVortrag">
            <ObjectDataProvider.MethodParameters>
                <sys:String>0</sys:String> <!-- Noch statisch bis ich soweit bin... -->
            </ObjectDataProvider.MethodParameters>  
        </ObjectDataProvider>
        ...
        <Style TargetType="Label"
               x:Key="WorkingLabel">
            <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter Property="Foreground" Value="Green"/>
                    <Setter Property="FontWeight" Value="Bold" />
                    <Setter Property="FontSize" Value="12" />
                </Trigger>
            </Style.Triggers>
            <Setter Property="Foreground" Value="Black" />
            <Setter Property="FontWeight" Value="Bold" />
            <Setter Property="FontSize" Value="12" />
        </Style>
    </Window.Resources>

    <Grid>
        ...
        <StackPanel Grid.Column="0" DataContext="{Binding ElementName=listbox,Path=SelectedItem}">
            ...
                <Label Content="1" Style="{StaticResource WorkingLabel}" />
                <Label Content="+" Style="{StaticResource WorkingLabel}" />
            </StackPanel>
            <StackPanel Orientation="Horizontal" DataContext="{StaticResource SelectedTime}" Name="TimeHolder"> <!-- Das ist leider noch nicht der richtige Weg -->
                <StackPanel Margin="5,5,5,5">
                    <Label Content="min:"  Width="35"/>
                    <TextBox Text="{Binding Path=Min,Mode=TwoWay,StringFormat=00}" HorizontalAlignment="Center"/>
                </StackPanel>
                <StackPanel Margin="5,5,5,5">
                    <Label Content="sek:"  Width="35"/>
                    <TextBox Text="{Binding Path=Sec,Mode=TwoWay,StringFormat=00}" HorizontalAlignment="Center"/>
                </StackPanel>
                ...
    </Grid>
</Window>
Methode getVortrag
Code:
public Vortrag getVortrag(string number)
        {
            int result;
            if (int.TryParse(number, out result))
            {
                return splitted.ElementAt(result);
            }
            else
            {
                System.Windows.MessageBox.Show("grummel");
                return null;
            }
        }
Klasse Vortrag:
Code:
public class Vortrag
    {
        int min = 00;
        int sec = 00;

        public int Min
        {
            get { return min; }
            set { min = value; }
        }
        public int Sec
        {
            get { return sec; }
            set { sec = value; }
        }

        public Vortrag() { }

        public TimeSpan VortragAsTimeSpan()
        {
            return new TimeSpan(0, min, sec);
        }
    }
 

Anhänge

  • Programm.png
    Programm.png
    14,4 KB · Aufrufe: 312
Zuletzt bearbeitet:
Das ist doch ziemlich simpel ;)

Der DataContext deines MainWindows ist eine Collection "Vorträge", darin gibt es auch irgendwo ein Property "AktuellerVortrag" an welches dein StackPanel gebunden ist. That's it.

Btw. Ohne INotifyPropertyChanged brauchst du mit DataBinding in WPF erst gar nicht anfangen.

Edit.
Deine eigentliche Frage vergessen ;)
Bei einem Klick wechselt nun nur noch das Property "AktuellerVortrag". Idealerweise ist der Button an einen Command gebunden und hat keinen OnClick-Handler.
 
Zuletzt bearbeitet:
Zum INotifyPropertyChanged:
Ist mir bekannt, soweit war ich noch nicht ^^, ich hab da heute morgen Angefangen und
dachte jop machste mal nen Timer... mmh was brauch ich da ... ah das könnte irgendwie... und das wäre doch ne nette Idee ...usw.

Ich glaube ich habe meine Frage Total Falsch gestellt :P... das StackPanel holt sich den DataContext aktuell über die angegebene Methode(getVortrag(string number)). Richtiger müsste also meine Frage lauten entweder:
  1. Wie setzte ich den MethodenParameter richtig oder
  2. wie kann ich ohne den Umweg über diese Methode den Context setzten?

Naja ich verfolge gerade auch wieder eine ganz andere Art, brauche aber jetzt wohl erst mal eine Pause ;)
 

Ähnliche Themen

Zurück
Oben