C# WPF ComboBox Binding

0

Witam,
Jestem na razie początkujący w WPF więc proszę o wyrozumiałość.
Na formie mam kilka pól między innymi ComboBoxy właśnie.

<ComboBox Margin="10, 5, 5, 5" x:Name="txtSelectedSystem" Width="150" HorizontalAlignment="Left" SelectionChanged="txtSelectedSystem_SelectionChanged" SelectedValuePath="Key" DisplayMemberPath="Value" Text="{Binding Value}" />

Lista wartości wczytywana:

this.txtSelectedSystem.ItemsSource = HSystems._GetAllSystems();

Zwracany typ wartości to lista obiektów klasy ComboBoxValuePair. Kod klasy poniżej:

public class ComboBoxValuePair
    {
        public int Key { get; set; }
        public string Value { get; set; }

        public ComboBoxValuePair(int Key, string Value)
        {
            this.Key = Key;
            this.Value = Value;
        }

        public ComboBoxValuePair()
        { }
    }

Wartości wczytują się na listę ComboBoxa bez problemu. Po wybraniu wartości wyświetla się poprawienie jako wybrana. Kiedy zapisuję wszystko do bazy też wartości są poprawnie zapisywane. Problem pojawia się przy odczycie. Odczytując dane z bazy też tworzę obiekt klasy ComboBoxValuePair. W pole Key wrzucam ID, w pole Value wrzucam w tym przypadku nazwę systemu. W ten sposób utworzony obiekt przypisuje do wybranego ComboBoxa, ale nie wyświetla wartości. ;/ Próbowałem w XAML dopisać jeszcze własność SelectedItem={Binding Path=Value}, ale nie poszło.

Z góry dziękuję za pomoc i zainteresowanie tematem.
Pozdrawiam,
Michał.

1

Własność SelectedItem musisz zbindować do obiektu typu ComboBoxValuePair, który ma zostać wyświetlony. Zobacz czy zadziała Tobie np. SelectedIndex.

1

Referencja do SelectedItem musi znajdować się kolekcji, która jest zbindowana jako ItemsSource. Nie pozostaje Ci nic innego jak tylko szukać w zbindowanej kolekcji i-tego obiektu, który spełnia warunki i zaznaczyć go jako SelectedItem. Inaczej się nie da, bo nie możesz zrobić sobie po prostu new Object() jako SelectedItem gdyż kolekcja nie ma do tego obiektu referencji.

Np tak zrób:

// pseudo-kod

private Object _selectedItem { get; set; }

public ObservableCollection<Object> Items { get; set; }
public Object SelectedItem  
	get { return this._selectedItem; }
	set {
		this._seletedItem = value;
		
		// magic-string będący nazwą własności;
		// można się go pozbyć w zależności od wersji .net'a, na którą się pisze kod.
		this.OnPropertyChanged("SelectedItem");
	}
}

...

// gdzieś w kodzie...
this.SelectedItem = Items[0];

Przy czym należy zaznaczyć, ze widok nie zostanie zaktualizowany jeżeli nie podepniesz pod to interfejsu INotifyPropertyChanged, którego implementacja jest wymagana jeżeli chcesz aktualizować combobox'a z poziomu back-endu (w tym wypadku aktualizujemy SelectedItem).

Poczytaj o czymś co się zwie databinding.

EDIT: W załączniku masz przykład jak to powinno wyglądać.

1 użytkowników online, w tym zalogowanych: 0, gości: 1