Wpf Binding von SelectedItem eines DataGrid mit UserControl TextBoxen und Window TextBoxen

  • WPF

SSL ist deaktiviert! Aktivieren Sie SSL für diese Sitzung, um eine sichere Verbindung herzustellen.

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Nofear23m.

    Wpf Binding von SelectedItem eines DataGrid mit UserControl TextBoxen und Window TextBoxen

    Hallo,
    bisher hatte ich den ganzen Code in einer großen XAML, jetzt würde ich ihn gerne aufteilen.
    Dazu sollte aber das SelectedItem des Datagrids in einer UserControl und in dem MainWindow verfügbar sein.
    Ich komm einfach nicht drauf wie dieses Binding funktionieren soll.

    Eine .zip des nicht funktionierenden Beispiel ist angehängt.

    XML-Quellcode

    1. <UserControl x:Class="WpfFlipperCs.Guis.MainJobTableUcs.MainJobTableUc">
    2. <UserControl.DataContext>
    3. <local:MainJobTableVm/>
    4. </UserControl.DataContext>
    5. <Grid>
    6. <DataGrid Name="MainDataDatagrid"
    7. ItemsSource="{Binding mainTablesCollObser, UpdateSourceTrigger=PropertyChanged}"
    8. SelectedItem="{Binding mainTableObserRow, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
    9. ...
    10. </DataGrid>
    11. </UserControl>



    XML-Quellcode

    1. <UserControl x:Class="WpfFlipperCs.Guis.AuswahlUcs.AuswahlUc">
    2. <UserControl.Resources>
    3. <boundMainJobTableUcs:MainJobTableUc x:Key="keyMainJobTableUc" x:Name="MainJobTableUc_Content"/>
    4. </UserControl.Resources>
    5. <Grid>
    6. <TextBox Text="{Binding Content.DataContext.mainTableObserRow.value0, ElementName=MainJobTableUc_Content, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
    7. Grid.Row="0" Grid.Column="1" MinWidth="50" Height="20" Background="red"/>
    8. </Grid>
    9. </UserControl>


    XML-Quellcode

    1. <Window x:Class="WpfFlipperCs.Guis.MainViews.MainWindow">
    2. <Window.Resources>
    3. <boundMainJobTableUcs:MainJobTableUc x:Key="keyMainJobTableUc" x:Name="MainJobTableUc_Content"/>
    4. </Window.Resources>
    5. <Grid>
    6. <StackPanel Orientation="Vertical">
    7. <TextBox Text="{Binding Content.DataContext.mainTableObserRow.value2,ElementName=bountUserControl, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
    8. Grid.Row="0" Grid.Column="1" MinWidth="50" Height="20" Background="Yellow"/>
    9. <TextBox Text="{Binding Content.DataContext.mainTableObserRow.value2, Source={StaticResource keyMainJobTableUc}, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
    10. Grid.Row="0" Grid.Column="1" MinWidth="50" Height="20" Background="LightGreen"/>
    11. </StackPanel>
    12. </Grid>
    13. </Window>


    Dieses Binding funktioniert nicht On Runtime
    Kann dabei jemand weiterhelfen?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „mojoReini“ ()

    Hallo mojoReini und Willkommen im Forum

    Ich habe dein Beispiel nur kurz überflogen. Ich nehme an das die oberen Controls alle auf das SeletedItem von DataGridView gebunden werden sollen richtig?
    Mach dir hierfür in der Klasse ein SelectedItem Property und binde das Datagrid Property SelectedItem auf dieses. Dann kann du die anderen Controls auf SelectedItem.value1 binden.

    PS: Schau dir CollectionViewSource an. Damit bindet man listen in der WPF viel komfortabler und hat zugleich Funtionen wie Sorting, Filtering usw.
    PPS: Einige ViewModel Klassen haben kein OnNotifyPropertieChanged implementiert aber ich nehme an das ist nur für das Beispiel.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    ich schnappte mir das nächstbeste nichtfunktionierende Element-Binding, und habe es durch ein StaticResource-Binding ersetzt: Ein Binding-Mismatch weniger, und da verhält sich auch iwas bisserl Binding-mässig allerdings updated es nicht immediately - aber immerhin:

    XML-Quellcode

    1. <!--
    2. <TextBox Text="{Binding Content.DataContext.mainTableObserRow.value2, ElementName=MainJobTableUc_Content}"
    3. Grid.Row="0" Grid.Column="1" MinWidth="50" Height="20" Background="LightGreen"/>
    4. -->
    5. <TextBox Text="{Binding Content.DataContext.mainTableObserRow.value2, Source={StaticResource keyMainJobTableUc}}"
    6. Grid.Row="0" Grid.Column="1" MinWidth="50" Height="20" Background="LightGreen"/>
    Da da noch viele weitere Binding-Mismatches rumfahren, und ühaupt ich finde sehr abenteuerlich gebunden ist, belasse ichs bei diesem Hint:
    bei Resourcen über den Key binden, ElementName geht nicht.
    Hallo zusammen,

    bin wohl schon zu sehr von meinem Beispiel gelesen worden und hab dadurch etwas verwirrendes drin gehabt und wahrscheinlich ist der Wunsch die Controls aufzuteilen für mich schon das Maximum, aber ich bleib dran. Das Bild im Anhang zeigt mein Hauptproblem (rot eingefärbt). Der linke Ausschnitt zeigt die Ansicht nach dem Start und der rechte Ausschnitt bei Click auf die Zeile mit id 2.

    Die CollectionViewSource ist gebunden, ist das falsch wenn ich die Klasse mit ObservableCollection als Itemsource benutze?


    UserControl mit DataGrid und DataContext

    XML-Quellcode

    1. <UserControl x:Class="WpfFlipperCs.Guis.MainJobTableUcs.MainJobTableUc"
    2. ...
    3. <TextBox Text="{Binding mainTableObserRow.value0, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
    4. MinWidth="50" Height="20" Background="LightGreen"/>
    5. ...
    6. <DataGrid Name="MainDataDatagrid",ItemsSource="{Binding mainTablesCollObser, UpdateSourceTrigger=PropertyChanged}"
    7. </UserControl>


    Problem UserControl da ich hier nicht die DataGrid haben will


    XML-Quellcode

    1. <UserControl x:Class="WpfFlipperCs.Guis.AuswahlUcs.AuswahlUc"
    2. ...
    3. <UserControl.Resources>
    4. <boundMainJobTableUcs:MainJobTableUc x:Key="keyMainJobTableUc"/>
    5. </UserControl.Resources>
    6. ...
    7. <TextBox Text="{Binding Content.DataContext.mainTableObserRow.value2, Source={StaticResource keyMainJobTableUc}, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
    8. MinWidth="50" Height="20" Background="Red"/>


    Im Window sollte alles zusammen kommen, spielt aber eigentlich keine Rolle mehr da die AuswahlUc On Runtime nicht mehr aktualisiert.

    Wie im jpg oder in der aktualisierten zip erkennbar.
    Bilder
    • BindingSuccess1.jpg

      109,39 kB, 1.152×720, 22 mal angesehen
    Dateien
    Hallo

    Ich habe dir mal ein "sauberes" Beispiel erstellt welches auf das mindeste reduziert ist.
    Dieses veranschaulicht (wie ich denke) ganz gut was ich in Post #2 geschrieben habe.

    Du solltest so wenig wie möglich auf Controls binden.
    Wenn du eine ViewModel Klasse hast das mach das doch über diese.

    PS: Was bringt dir folgendes????

    XML-Quellcode

    1. ​<Window.Resources>
    2. <boundMainJobTableUcs:MainJobTableUc x:Key="keyMainJobTableUc"/>
    3. </Window.Resources>


    Grüße
    Sascha
    Dateien
    • WpfReiniTest.zip

      (87,73 kB, 12 mal heruntergeladen, zuletzt: )
    If _work = worktype.hard Then Me.Drink(Coffee)
    Hallo Sascha,
    ok, nach dem ich kein Programmierer bin, kein Coaching habe usw.
    und Bücher/Text oft rätselhaft erscheinen, könnte es sein dass du mir
    versucht hast zu erklären/zeigen ich muss die ganze Sache andersherum angehen?

    Funktionieren so weit tut es schon, aber das Script greift sich halt den nächsten
    DataContext des Windows(nicht dem aus z.B. der UserControl), also auch wieder nicht ganz richtig, was muss
    andes gemacht werden, soll ich die zip dazu noch einspielen?

    Auf jeden Fall VIELEN Dank :thumbsup:


    Und vorallem muss ich mir gedanken über Größe und Breite machen, das wird nun von der Xaml auch anders behandelt, wahrscheinlich.

    XML-Quellcode

    1. <Window x:Class="InvertViceVersa.Guis.MainViews.MainWindow"
    2. ...
    3. <Window.DataContext>
    4. <local:MainWindowVm/>
    5. </Window.DataContext>
    6. <Grid>
    7. <StackPanel Orientation="Vertical">
    8. <StackPanel Orientation="Horizontal">
    9. <boundViews:AuswahlUc Margin="5,5,0,0" ></boundViews:AuswahlUc>
    10. </StackPanel>
    11. <boundViews:MainJobTableUc Margin="5,5,0,0" ></boundViews:MainJobTableUc>
    12. </StackPanel>
    13. </Grid>



    Hallo nochmal(kleine Ergänzung, hab weiter gesucht)
    das heißt dann bekommt das UserControl einen zweiten DataContext

    XML-Quellcode

    1. <UserControl x:Class="InvertViceVersa.Guis.Views.AuswahlUc"
    2. ...
    3. <UserControl.Resources>
    4. <boundViewModels:AuswahlVm x:Key="keyAuswahlVm"/>
    5. </UserControl.Resources>
    6. <Grid >
    7. ....
    8. <TextBox Text="{Binding titel, UpdateSourceTrigger=PropertyChanged}" DataContext="{Binding Source={StaticResource keyAuswahlVm}}" TextWrapping="Wrap" Width="80"></TextBox>



    Dann wird auch die im Bild leere TextBox gebunden.

    Bilder
    • ViceVersa1.jpg

      113,26 kB, 1.281×646, 10 mal angesehen

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „mojoReini“ ()

    Hallo

    ​Kannst gerne eine Zip einstellen.
    ​Warum beim Start keine Values im UCL sind? hast du wie ich im CollectionView CurrentItem gesetzt??

    Die Größe der Controls oder ähnliches hat nichts damit zu tun wie du Bindest.

    ​aber das Script greift sich halt den nächsten
    DataContext des Windows


    ​Warum? du gibst ja den DataContext an. Warum soll er das Windows holen. In meinem Beispiel hatte ich einfach im Loaded "Me.DataContext = new blablaViewModel" drinnen.
    ​Du hast es hald im XAML gesetzt. Macht im Grunde keinen Unterschied.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Hallo

    ​Wenn du mehrere TextBoxen auf einem Window hast musst du ja auch nicht jeder TextBox den Datacontext angeben.
    ​Er reicht wenn du dem Window einen DataContext gibst.

    ​Hast du z.b. ein ViewModel sagen wir Personen und diese Personen haben Freude über das Property "Friends". Dann kannst du im Window alle TextBoxen für Vor, Nachname und alles reinpacken.
    ​In einem Usercontrol kannst du alles für die "Friends" reinpacken und in das Window geben. Dann gibst du dem UserControl nicht den DataContext neu sondern sagst beim UserControl nur noch DataContext=Binding={Friends}.
    Mehr nicht.

    ​Thema Vererbung. Gilt übrigens auch für Style, Templates, DataTempates, usw.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)