Databinding na objekty   zodpovězená otázka

C#

Dobrý den,

potřeboval bych poradit ohledně databindingu s objekty.

Moc nechápu systém databindingu, z dokumentace mi vychází, že mám objekt s nějakou vlastností, který hlídá objekt binding a po změně vlasnosti binding objekt změní hodnotu vlastnosti na kterou je navázán.

Příklad kódu je níže, ale nefunguje to jak bych čekal.

V textboxu se hodnota objeví, ale po změně vlastnosti se hodnota v textboxu nezmění.

Poradil by někdo v čem je zakopanej pes ?

Př. objektu

    public class TestBinding
    {
        private int _nInt = 0;
        public int Val
        {
            get { return this._nInt; }
            set { this._nInt = value; }
        }
    }

Př. formu s jedním textboxem.

    public partial class Form1 : Form
    {
        public Binding bindingObject;
        public TestBinding test = new TestBinding();

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            this.bindingObject = new Binding("Text", test.Val.ToString(), "");
            this.bindingObject.ControlUpdateMode = ControlUpdateMode.OnPropertyChanged;
            this.bindingObject.DataSourceUpdateMode = DataSourceUpdateMode.OnPropertyChanged;
            this.textBox1.DataBindings.Add(this.bindingObject);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            this.test.Val++;
        }

    }

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Dovolím si udělat menší úpravu.

private void Form1_Load(object sender, EventArgs e)
{
  this.DataBindings.Add("Text", test, "Val");
}

První parametr je jaká vlastnost bindovaného objektu (v tomto případě this - formulář) má být měněna datovým zdrojem, druhý parametr je datový zdroj a třetí parametr je z jaké vlastnosti datového zdroje se má brát hodnota. Všechno ostatní (např. směr bindingu) je automatické podle výchozích nastavení ale dá se to samozřejmě změnit programově.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Děkuji za odpověď

ještě bych se zeptal na směr databindingu.

Objekt se mi mění správně podle toho co zapisuji do textboxu -> to bude směr do objektu.

Ale pokud se hodnota proměnné v objektu změní programově v tomto případě tlačítkem a inkrementací tak se v textboxu nic nemění.

Jak se tedy nastavují směry databindingu ?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ve výchozím stavu je binding nastaven obousměrně, tj. změny se propagují tam i zpátky. Problém je v tom, že aby to fungovalo tak jak chcete (tedy při změně vlastnosti byl aktualizován ovládací prvek), musí váš datový zdroj (zde třída TestBinding) implementovat rozhraní INotifyPropertyChanged, které mechanizmus bindingu využívá k detekci změn dat. Nic není jednoduché, na druhou stranu je to ale logické, protože jak jinak by se binding dozvěděl o tom, že se v datovém objektu něco změnilo.

http://msdn.microsoft.com/en-us/library/...

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Tohle již funguje děkuji

kód:

    public partial class Form1 : Form
    {
        public Binding bindingObject;
        public TestBinding test = new TestBinding();

        public Form1()
        {
            InitializeComponent();
            
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            this.bindingObject = new Binding("Text", test, "Val");
            this.bindingObject.ControlUpdateMode = ControlUpdateMode.OnPropertyChanged;
            this.bindingObject.DataSourceUpdateMode = DataSourceUpdateMode.OnPropertyChanged;
            this.textBox1.DataBindings.Add(this.bindingObject);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            this.test.Val++;
        }
    }

    public class TestBinding : INotifyPropertyChanged
    {
        private int _nInt = 0;

        public int Val
        {
            get { return this._nInt; }
            set
            {
                if (PropertyChanged != null)
                {
                    this._nInt = value;
                    this.PropertyChanged(this, new PropertyChangedEventArgs("Val"));
                }
            }
        }

        #region INotifyPropertyChanged Members

        public event PropertyChangedEventHandler PropertyChanged;

        #endregion
    }

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback