Laden...

selectedItem Binding einer ComboBox

Erstellt von Connected vor 2 Jahren Letzter Beitrag vor 2 Jahren 202 Views
C
Connected Themenstarter:in
4 Beiträge seit 2021
vor 2 Jahren
selectedItem Binding einer ComboBox

Hallo zusammen,

ich hoffe Ihr könnt mir bei meinem Problem helfen.

Ich erstelle eine sehr dynamische Seite, in der je nach Anzahl der "Listen" x Checkboxen und x Comboboxen angelegt werden. In diesen Comboboxen können ebenfalls x beliebige Werte stehen. Das erstellen und befüllen über Bindings funktioniert auch einwandfrei.

Probleme habe ich aber damit, das selectedItem aus einer ComboBox zu bekommen über das Binding. Grundsäzlich wird die ComboBox über die ObservableCollection InternalData vom Typ IssueDescriptions befüllt. Nun möchte ich, das ich über die Auswahl der comboBox den Inhalt der Klasse IssueDescriptions zurückbekomme, um die Daten weiter verarbeiten zu können. Das bekomme ich aber einfach nicht hin

Anbei ein Teilausschnitt.


       public class IssueData : ObservableObject
        {
            public string TestcaseName { get; set; }
            private bool _isChecked { get; set; }

            public bool isChecked
            {
                get { return _isChecked; }
                set
                {
                    if (value != _isChecked)
                    {
                        _isChecked = value;
                        OnPropertyChanged();
                    }
                }
            }

            private ObservableCollection<IssueDescriptions> _internalData = new ObservableCollection<IssueDescriptions>();
            public ObservableCollection<IssueDescriptions> InternalData
            {
                get { return _internalData; }
                set
                {
                    if (value != _internalData)
                    {
                        _internalData = value;
                        OnPropertyChanged();
                    }
                }
            }
        }


         public class IssueDescriptions 
        {
            public string VocaPrio { get; set; }
            private string Description { get; set; }
        }

XAML Part für die ComboBox


                                          <DataTemplate>
                                            <Grid>
                                                <Grid.RowDefinitions>
                                                    <RowDefinition Height="*"/>
                                                    <RowDefinition Height="*"/>
                                                </Grid.RowDefinitions>
                                                <CheckBox Grid.Row="0" 
                                                          Margin="0,10,0,5" 
                                                          IsChecked="{Binding isChecked}"
                                                          Content="{Binding TestcaseName}"></CheckBox>
                                                <ComboBox Grid.Row="1" 
                                                          Width="520"
                                                          HorizontalAlignment="Left"
                                                          IsSynchronizedWithCurrentItem="True"
                                                          SelectedItem="{Binding Hier Binding um die ausgewählten Daten der Klasse IssueDescriptions zu bekommen}"
                                                          ItemsSource="{Binding InternalData}" 
                                                          IsReadOnly="True" >
                                                    
                                                    <ComboBox.ItemTemplate>
                                                        <DataTemplate>
                                                            <Grid>
                                                                <Grid.ColumnDefinitions>
                                                                    <ColumnDefinition Width="55"/>
                                                                    <ColumnDefinition Width="10"/>
                                                                    <ColumnDefinition Width="5"/>
                                                                    <ColumnDefinition Width="*"/>
                                                                </Grid.ColumnDefinitions>
                                                                <TextBlock Grid.Column="0"
                                                                           Text="VoCA Prio"/>
                                                                <TextBlock Grid.Column="1"
                                                               Text="{Binding VocaPrio}">
                                                                </TextBlock>
                                                                <TextBlock Grid.Column="2"
                                                                           Text=":"/>
                                                                <TextBlock Grid.Column="3"
                                                               Text="{Binding Description}">
                                                                </TextBlock>
                                                            </Grid>
                                                        </DataTemplate>
                                                    </ComboBox.ItemTemplate>
                                                </ComboBox>
                                            </Grid>
                                        </DataTemplate>

Hoffentlich kann mir hier jemand helfen und mir erklären wie das funktioniert.

Vielen Dank im Voraus.

16.842 Beiträge seit 2008
vor 2 Jahren

Hi, ist schematisch alles beschrieben in [Artikel] MVVM und DataBinding

C
Connected Themenstarter:in
4 Beiträge seit 2021
vor 2 Jahren

Hallo,

vielen dank für die schnelle Antwort, nur leider hilft mir das nicht weiter. Grundsätzlich weiß ich wie das Binding funktioniert, mache ich bereits mehrfach für einzelne Elemente in einer Listview siehe hier.

Beispiel


private ObservableCollection<string> _DataCollection = new ObservableCollection<string>();

public ObservableCollection<string> DataCollection
{
   get { return _starcDataCollection; }
   set
   {
        if (value != _starcDataCollection)
        {
           _starcDataCollection = value;
            OnPropertyChanged();
         }
     }
}
public string SelectedDevice { get; set; }




<ListBox Grid.Row="1"
                         Name="StarcDeviceList"
                         Grid.Column="2"
                         HorizontalAlignment="Left"
                         Width="150"
                         Margin="10"
                         BorderThickness="1"
                         ItemsSource="{Binding DataCollection}"
                         SelectedItem="{Binding SelectedDevice}">
                    </ListBox>

Aber für den Fall im Eingangspost bekomme ich das einfach nicht auf die Kette. Hier wäre Hilfe oder ein Denkanstoß hilfreich 🙂

190 Beiträge seit 2012
vor 2 Jahren

Mache doch einfach ein Property vom Typ IssueDescriptions dazu und binde es an SelectedItem. So steht es ja auch in deinem Beispiel.

  • Wer lesen kann, ist klar im Vorteil
  • Meistens sitzt der Fehler vorm Monitor
  • "Geht nicht" ist keine Fehlermeldung!
  • "Ich kann programmieren" != "Ich habe den Code bei Google gefunden"

GidF

C
Connected Themenstarter:in
4 Beiträge seit 2021
vor 2 Jahren

Mache doch einfach ein Property vom Typ IssueDescriptions dazu und binde es an SelectedItem. So steht es ja auch in deinem Beispiel.

Du meinst folgendes (siehe letzte Zeile)?


 public class IssueDescriptions : ObservableObject
        {
            public string _vocaPrio { get; set; }

            public string VocaPrio
            {
                get { return _vocaPrio; }
                set
                {
                    if (value != _vocaPrio)
                    {
                        _vocaPrio = value;
                        OnPropertyChanged();
                    }
                }
            }

            public string _description { get; set; }

            public string Description
            {
                get { return _description; }
                set
                {
                    if (value != _description)
                    {
                        _description = value;
                        OnPropertyChanged();
                    }
                }
            }
        }

public IssueDescriptions selectedData { get; set; }

Wenn ich das mache bekomme ich die Binding error message, dass das Property nicht in IssueData existiert.

System.Windows.Data Error: 40 : BindingExpression path error: 'selectedData' property not found on 'object' ''IssueData' (HashCode=42488815)'. BindingExpression:Path=selectedData; DataItem='IssueData' (HashCode=42488815); target element is 'ComboBox' (Name=''); target property is 'SelectedItem' (type 'Object')

190 Beiträge seit 2012
vor 2 Jahren

Da hat der Computer auch Recht. Du mußt es schon in die Klasse IssueData machen, wo auch schon InternalData ist.
Auch solltest du der Methode OnPropertyChanged() den Namen des Property übergeben. Steht auch so in dem von Abt verlinkten Artikel.

  • Wer lesen kann, ist klar im Vorteil
  • Meistens sitzt der Fehler vorm Monitor
  • "Geht nicht" ist keine Fehlermeldung!
  • "Ich kann programmieren" != "Ich habe den Code bei Google gefunden"

GidF

16.842 Beiträge seit 2008
vor 2 Jahren

Auch solltest du der Methode OnPropertyChanged() den Namen des Property übergeben. Steht auch so in dem von Abt verlinkten Artikel.

Sofern es eine moderne Implementierung ist, ist der Name mittlerweile optional.

Gewusst wie: Implementieren von Benachrichtigungen bei Eigenschaftenänderungen - WPF .NET Framework


      // Create the OnPropertyChanged method to raise the event
      // The calling member's name will be used as the parameter.
      protected void OnPropertyChanged([CallerMemberName] string name = null)
      {
          PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
      }

Siehe auch INotifyPropertyChanged Schnittstelle (System.ComponentModel)

Aber ja, hier ist das Problem, dass das falsche Objekt / der falsche Typ der Context ist

C
Connected Themenstarter:in
4 Beiträge seit 2021
vor 2 Jahren

Da hat der Computer auch Recht. Du mußt es schon in die Klasse IssueData machen, wo auch schon InternalData ist.
Auch solltest du der Methode OnPropertyChanged() den Namen des Property übergeben. Steht auch so in dem von Abt verlinkten Artikel.

Oh wie blöd von mir. Danke für deine Hilfe.

So gehts jetzt

Innerhalb der Klasse


            private IssueDescriptions _selectedData { get; set; }
            public IssueDescriptions SelectedData
            {
                get { return _selectedData; }
                set
                {
                    if (value != _selectedData)
                    {
                        _selectedData = value;
                        OnPropertyChanged();
                    }
                }
            }