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.
Hi, ist schematisch alles beschrieben in [Artikel] MVVM und DataBinding
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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 🙂
Mache doch einfach ein Property vom Typ IssueDescriptions dazu und binde es an SelectedItem. So steht es ja auch in deinem Beispiel.
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')
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.
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
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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();
}
}
}