Diskuze: WPF binding mezi <DataTemplate> a ObservableCollecton<string> nevrací hodnotu do zdroje

C# .NET .NET (C# a Visual Basic) WPF binding mezi <DataTemplate> a ObservableCollecton<string> nevrací hodnotu do zdroje American English version English version

Avatar
pavel.pihera
Člen
Avatar
pavel.pihera:

Ahoj! Potýkám se s tímto (pravděpodobně banálním) problémem:

  1. Mám dejme tomu objekt "osoba" třídy "cOsoba" s kolekcí (ObservableCo­llection<strin­g>) "Adresy".
  2. Tyto adresy bych chtěl editovat ve formuláři. Formulář má dataContext nastavený na objekt "osoba". V něm mám ItemsControl s ItemsSource nastaveným na kolekci "Adresy".
  3. ItemsControl.I­temTeplate obsahuje DataTemlpate s TextBoxem jehož Text je nastaven takto: Text=""{binding .}"

Problém: Data z kolekce se do formuláře přenáší korektně, obráceným směrem ne. Kdybych vytvořil další objekt např. třídy "cAdresa" s property např. "Text" a vlastní adresu umístil do této property a bindoval k ní takto: Text=""{binding Text}", tak to bude fungovat bez problémů, ale přijde mi to nepraktický.

Díky za radu!

 
Odpovědět 27.11.2014 22:00
Avatar
Odpovídá na pavel.pihera
Andrej Farkaš:

Si si istý, že sa dáta neprenášajú? Možno sa len prenášajú "po potvrdení zmeny v textboxe". Vyskúšaj rozšíriť binding.

<TextBox Text="{Binding <property>, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />

Ale môže to byť spôsobené niečím iným, ale mne sa minule stalo, že sa to prenášalo do viewmodelu až po "potvrdení zmeny".

Nahoru Odpovědět 27.11.2014 22:29
Live. Love. Learn.
Avatar
pavel.pihera
Člen
Avatar
Odpovídá na Andrej Farkaš
pavel.pihera:

Už jsem to také zkoušel, ale v tom problém není. :( Problém je pouze, když použiji "Binding ." nebo "Binding Value=." V ostatních případech to funguje správně. Tady je případně zdroják: www.apstr.cz/wpf2.zip

Díky!

 
Nahoru Odpovědět 27.11.2014 22:36
Avatar
Odpovídá na pavel.pihera
sadlomaslox25:

string je imutable. musis ho wrapnout.

namespace Pokus
{
    class cOsoba
    {
        private ObservableCollection<Adresa> _adresy = new ObservableCollection<Adresa>();
        public ObservableCollection<Adresa> Adresy { get { return _adresy; } set { _adresy = value; } }
    }

    public class Adresa
    {
        public string adresa { get; set; }
    }
}
<TextBox Text="{Binding adresa, Mode=TwoWay}"/>
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět 27.11.2014 22:59
Avatar
pavel.pihera
Člen
Avatar
Odpovídá na sadlomaslox25
pavel.pihera:

Šlo mi o to, zda neexistuje jednodušší řešení. Z odpovědi jsem pochopil, že ne. V důsledku jsem to vyřešil stejně. Díky moc!

 
Nahoru Odpovědět 27.11.2014 23:04
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.