Laden...

Combobox in DataGrid zeigt keinen Wert zur Auswahl

Erstellt von BJA-CH vor 6 Jahren Letzter Beitrag vor 6 Jahren 1.357 Views
B
BJA-CH Themenstarter:in
59 Beiträge seit 2017
vor 6 Jahren
Combobox in DataGrid zeigt keinen Wert zur Auswahl

Ich benötige eure Hilfe. In einem UserControl ist ein DataGrid, welches das ItemsSource und das SelectecValue über je einen Property bezieht:


        public static readonly DependencyProperty RegelnProperty =
            DependencyProperty.Register("Regeln", typeof(Regeln), typeof(RegelDefinitionControl),
                new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
                    new PropertyChangedCallback(OnRegelnPropertyChanged)));

        public Regeln Regeln
        {
            get { return (Regeln)GetValue(RegelnProperty); }
            set { SetValue(RegelnProperty, value); }
        }

        private static void OnRegelnPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            RegelDefinitionControl control = (RegelDefinitionControl)d;
            if (control != null)
                control.OnRegelnChanged((Regeln)e.OldValue, (Regeln)e.NewValue);
        }

        private void OnRegelnChanged(Regeln oldValue, Regeln newValue)
        {
        }

        public static readonly DependencyProperty AttributListeProperty =
            DependencyProperty.Register("AttributListe", typeof(ObservableCollection<Attribut>), typeof(RegelDefinitionControl),
                new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
                    new PropertyChangedCallback(OnAttributListePropertyChanged)));

        public ObservableCollection<Attribut> AttributListe
        {
            get { return (ObservableCollection<Attribut>)GetValue(AttributListeProperty); }
            set { SetValue(AttributListeProperty, value); }
        }

        private static void OnAttributListePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            RegelDefinitionControl control = (RegelDefinitionControl)d;
            if (control != null)
                control.OnAttributListeChanged((ObservableCollection<Attribut>)e.OldValue, (ObservableCollection<Attribut>)e.NewValue);
        }

        private void OnAttributListeChanged(ObservableCollection<Attribut> oldValue, ObservableCollection<Attribut> newValue)
        {
        }


Dazu versuche ich im XAML die Definition für die Anzeige der Attributesliste aus Auswahl in einer DataGrid-Celle zu binden.


 <DataGrid Grid.Row="4" Grid.Column="1" Name="dgKondition" AutoGenerateColumns="False" 
                      CellStyle="{StaticResource Body_Content_DataGrid_Centering}"     
                      VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto"
                      ItemsSource="{Binding Path=Regeln.RegelSaetze, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                      CanUserAddRows="True" CanUserDeleteRows="True" CanUserReorderColumns="False" CanUserResizeColumns="True"
                      CanUserSortColumns="False" CanUserResizeRows="False" Grid.ColumnSpan="2" Grid.RowSpan="2">
                <DataGrid.Columns>
                    ...
                    <DataGridComboBoxColumn Header="Attribut"
                                            ItemsSource="{Binding Path=AttributListe, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"
                                            DisplayMemberPath="Name"
                                            SelectedValueBinding="{Binding Path=AttributName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                                            SelectedValuePath="Name"/>
                    ...
                </DatagridColumns>
</DataGrid>

Doch irgendwie will dies nicht so recht, zumindest zeigt das Combobox keinen Wert in der Auswahl.
Ausserhalb des DataGrides funktioniert das Combobox als eigenständiges Control durchaus richtig. Also meine ich, kann es nicht an der grundsätzlichen Konfiguration liegen. Da muss das DatatGrid irgend was Unterwartetes tun...

Danke gfür eure Hilfe!

5.657 Beiträge seit 2006
vor 6 Jahren

Hi BJA-CH,

von welchem Typ ist die Eigenschaft AttributName? Bestimmt nicht vom Typ Attribute? Eigentlich müßten DataBinding-Fehler im Ausgabefenster angezeigt werden, siehe dazu auch [Artikel] MVVM und DataBinding, Abschnitt "Debugging".

Weeks of programming can save you hours of planning

212 Beiträge seit 2008
vor 6 Jahren

Guten Morgen!

Setz mal die ComboBox auf "IsEditable=True". Ich meine das ich mal exakt das selbe Problem damit gelöst habe. Vielleicht hilft das ja? Ich könnte auch suchen ob ich wiederfinde wir das damals gemacht habe.

Gruß
Christoph

B
BJA-CH Themenstarter:in
59 Beiträge seit 2017
vor 6 Jahren

Es scheint tatsächlich ein Binding-Problem zu bestehen. Ich hatte meine UserControl als "Benutzersteuerelement" gebaut. Habe festgestellt, dass das Conrtol die gebundenen Daten nicht im Control sucht, sondern in der aufrufenden MainWindowViewModel-Klasse.
Habe nun das gleiche als "Benutzerdefiniertes UserControl" gebaut. Ist zwar etwas mühsamer zu bauen, aber dort habe ich das Binding im Griff und kann bestimmen, woher er die Daten nehmen soll. uns viola, es funktioniert...

Ich verstehe nun nur nicht ganz den Unterschied zwischen einem "Benutzersteuerelement" und einem "Benutzerdefiniertes UserContro". War dieser Fehler Zufall oder gibt es da tatsächlich wesentliche Unterschiede zwischen diesen beiden UserControl-Typen?