Laden...

DataGrid Columns direkt an Objektinstanz binden

Erstellt von KST vor 11 Jahren Letzter Beitrag vor 11 Jahren 1.758 Views
K
KST Themenstarter:in
44 Beiträge seit 2012
vor 11 Jahren
DataGrid Columns direkt an Objektinstanz binden

Hallo!

Ich versuche vergebens folgendes hinzukriegen:

  • Ich befinde mich nur in einem Window
  • Es gibt einen DataGrid, der mit Daten aus einer DB beladen wird
  • Es gibt eine Instanz (hier nur als Bsp) der Klasse Auto, öffentlich -->EinAuto

public class Auto : DependencyObject
    {
        public static readonly DependencyProperty MarkeProperty
            = DependencyProperty.Register("Marke", typeof(String), typeof(Person));

        public String Marke
        {
            get { return (String)GetValue(MarkeProperty); }
            set { SetValue(MarkeProperty, value); }
        }

        public static readonly DependencyProperty TypeProperty
           = DependencyProperty.Register("Type", typeof(String), typeof(Person));

        public String Type
        {
            get { return (String)GetValue(TypeProperty); }
            set { SetValue(TypeProperty, value); }
        }               
    }


<Window x:Class="WPF_ADOSample1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="1119" Width="1289">
    <Window.Resources>        
    </Window.Resources>
    <Grid>
        <DataGrid ItemsSource="{Binding Autos}"
                  AutoGenerateColumns="False" Height="172" 
                  HorizontalAlignment="Left" Margin="136,169,0,0" 
                  Name="dataGridm" VerticalAlignment="Top" Width="1042" ColumnWidth="Auto" 
                  MaxColumnWidth="180" IsSynchronizedWithCurrentItem="False" 
                  SelectedValuePath="Typ" 
                  SelectedValue="{Binding Path=EinAuto.Type, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
            <DataGrid.Columns>                
                <DataGridTextColumn 
                    Header="Marke" 
                    Width="200"
                    Binding="{Binding Marke}" 
                    FontSize="14">
                </DataGridTextColumn>
                <DataGridTextColumn 
                    Header="Type" 
                    Width="220"
                    Binding="{Binding Type}" 
                    FontSize="14" />
            </DataGrid.Columns>
        </DataGrid>
        <TextBox Height="50" HorizontalAlignment="Left" Margin="546,554,0,0"
                 Name="textBox4" VerticalAlignment="Top" Width="395"
                 DataContext="{Binding ElementName=dataGridm, Path=SelectedItem}" 
                 Text="{Binding Marke}"/>
        <TextBox Height="50" HorizontalAlignment="Left" Margin="546,554,0,0"
                 Name="textBox5" VerticalAlignment="Top" Width="395"
                 DataContext="{Binding ElementName=dataGridm, Path=SelectedItem}" 
                 Text="{Binding Type}"/>
    </Grid>
    
</Window>

Ich schaffe alle möglichen Bindungen, z.B. EINE Spalte mittels SelectedValue & SelectedPath direkt an die Instanz EinAuto zu binden (wobei eine Veränderung der Werte in der Instanz wieder nicht zu einem Update im Grid führt) oder Textboxen direkt an an die jeweilige Spalte zu binden.

Ich würde gerne:
Bei Selektion einer Zeile im DataGrid die jeweiligen Spaltenwerte direkt in die Properties schreiben. Im Idealfall so, wie wenn ich eine TextBox direkt an die DatenQuelle Autos binden würde, IsSynchronizedwithCurrentItem auf true setzen würde, und Änderungen auch immer gleich an der Quelle berücksichtigt würden.Textboxen direkt an die Datenquelle Autos zu binden, IsSynchronizedWithCurrentItem auf true und dann die TextBoxen.Text an EinAuto zu binden hilft mir nicht. Ich würde das Objekt mit gültigen Referenzen auf den Grid oder auf die Datenquelle benötigen.

Bin dankbar für jeden richtungsweisenden Hinweis

925 Beiträge seit 2004
vor 11 Jahren

Hast du schon probiert, bei der Bindung der einzelnen Felder ebenfalls UpdateSourceTrigger=PropertyChanged einzusetzen?

Beispiel:


<DataGridTextColumn
                    Header="Type"
                    Width="220"
                    Binding="{Binding Type, UpdateSourceTrigger=PropertyChanged}"
                    FontSize="14" />

K
KST Themenstarter:in
44 Beiträge seit 2012
vor 11 Jahren

Hi!

Die Bindung der einzelnen Columns geht in Richtung der Datenquelle, also in Richtung DataTable!
Ich möchte es schaffen, den Inhalt der Spalten aus dem DataTable zu beziehen und an das Auto Objekt zu binden!

F
10.010 Beiträge seit 2004
vor 11 Jahren

Du willst also von hinten durch die Brust ins Auge?

Warum willst du das so machen, statt dann gleich eine ObservableCollection<Auto> zu benutzen?

K
KST Themenstarter:in
44 Beiträge seit 2012
vor 11 Jahren

Naja, weil es mir so praktischer erscheint!

Ich brauch in der ganzen Anwendung eigentlich nur DataTables bzw die Werte daraus! Diese stell ich immer in Form von Datagrids dar, die ich grossteils Modulartig in UserControlls verpackt habe!

In einem Fenster, muss ich aber einiges an Berechnungen durchführen, da reicht es mir nicht aus, die Werte einfach aus dem DataTable zu holen (sonst mach ich die Berechungen grossteils direkt in der Datenbank in Form von Spaltenoperationen oder bei den Selects, die Werte im DataTable sind dann alle die ich brauche). Nur hier würde ich gerne das eine Objekt an die Schnittstelle im UC anbinden, um dann für weitere Berechnungen, die ich nur mache wenn es selektiert ist, auf die Daten (Hier Marke, Type) zugreifen zu können (und nicht diese Werte aus den jeweiligen TextBoxen holen).