[C#,WPF] Combobox Binding blijft leeg

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • NC83
  • Registratie: Juni 2007
  • Laatst online: 21-08 21:44
Ik heb een formulier waarop ik een combobox heb gebonden aan de backend logic, echter deze combo blijft leeg als ik het backend object op een optie zet die niet in de comboBox.Items voor komt. Hoe krijg ik het voor elkaar om de combobox toch dit item te laten weergeven. Het is echter niet de binding die het probleem is die werkt gewoon wel voor items die wel in de comboBox.Items voorkomen.

Ik kan helaas niet dit Item aan de comboBox.Items toevoegen omdat de applicatie dan probeert om een Xinput of Direct Input Device probeert aan te maken zodat we button presses kunnen registreren.

[ Voor 11% gewijzigd door NC83 op 06-10-2009 11:13 ]

ex-FE Programmer: CMR:DiRT2,DiRT 3, DiRT Showdown, GRID 2, Mad Max


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Laat eens wat code zien, want ik snap eerlijk gezegd niet precies wat je probleem is.

Is je collectie waar je aan bind bijvoorbeeld wel een ObservableCollection, anders word er natuurlijk niet automatisch geupdate.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Razr
  • Registratie: September 2005
  • Niet online
Zoals Woy ook al aangeeft kan ik niet helemaal uit je post halen wat je bedoeld. Maar ik heb een vermoeden dat het fout gaat omdat je client / view niet wordt geupdate bij een 'wijziging' in je back-end?

Ik zal in dat geval eens kijken naar INotifyPropertyChanged, welke hiervoor is gemaakt. Kijk even bij 'remarks' over het hoe en wat.

Acties:
  • 0 Henk 'm!

  • NC83
  • Registratie: Juni 2007
  • Laatst online: 21-08 21:44
Het is een string ComboBox.TextProperty wordt gebruikt, de collectie van Items is niet waar de binding op werkt. Dat is in ieder geval niet wat ik wil met deze binding, deze binding moet er alleen voor zorgen dat de device name in de UI hetzelfde is als in de backend.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
        private Binding InitialiseBinding(int rowNumber, String propertyName, IValueConverter converter)
        {
            Binding binding = new Binding();
            ActionAxis axis = m_action.getAxis(rowNumber);
            binding.Source = axis;
            binding.Path = new PropertyPath(propertyName);
            binding.Mode = BindingMode.TwoWay;
            binding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
            binding.NotifyOnSourceUpdated = true;
            binding.NotifyOnTargetUpdated = true;
            if (converter != null)
            {
                binding.Converter = converter;
            }

#if DEBUG
            System.Diagnostics.PresentationTraceSources.SetTraceLevel(binding, System.Diagnostics.PresentationTraceLevel.High);
#endif

            return binding;
        }


De Set binding die gebruikt wordt is de volgende
C#:
1
comboBox.SetBinding(ComboBox.TextProperty, binding);


@Razr de class van het data object implementeerd INotifyProperty allang. Voor alle andere comboboxenop die op het formulier staan werkt bovenstaande code dus daar zit het probleem niet..

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    public class ActionAxis : INotifyPropertyChanged
    {

    ...
     
    public String DeviceName
        {
            get { return m_deviceName; }
            set
            {
                m_deviceName = value;
                OnPropertyChanged("DeviceName");
            }
        }
    
   ...
}


Het probleem zit er in dat als ComboBox.Items leeg is de TextProperty wel gewoon update, als de ComboBox.Items echter niet leeg is dan worden alleen waardes in de TextProperty weergegeven die ook daadwerkelijk in ComboBox.Items voorkomen. Althans hier lijkt het op het moment op.

edit:

Alle bindings zijn dynamisch omdat het allemaal dynamisch gegenereerd wordt, vanuit een file of door een button klik op het formulier zelf.

Het wegschrijven in de TextPoperty heeft niks te maken met het leeg zijn van ComboBox.Items maar met de Editable flag van de ComboBox.

[ Voor 6% gewijzigd door NC83 op 06-10-2009 11:48 ]

ex-FE Programmer: CMR:DiRT2,DiRT 3, DiRT Showdown, GRID 2, Mad Max


Acties:
  • 0 Henk 'm!

  • NC83
  • Registratie: Juni 2007
  • Laatst online: 21-08 21:44
OK oplossing gevond het is niet de mooiste oplossing maar hij werkt wel.

Als je de combobox editable maakt kan je naar de TextProperty van de combo schrijven. Echter wil je niet dat de User in deze box iets kan schrijven dus zet je ook de IsReadOnlyProperty op true.
Nu laat de combo toe om er vanuit de code naar te schrijven maar niet vanuit de UI.

Als iemand een andere oplossing heeft wil ik deze graag horen.

ex-FE Programmer: CMR:DiRT2,DiRT 3, DiRT Showdown, GRID 2, Mad Max