Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Problém s DataBinding - TimeSpan vs kolekce<TimeSpan>

Aktivity
Avatar
Petr Nymsa
Tvůrce
Avatar
Petr Nymsa:22.3.2015 22:55

Ahoj, potácím se s jedním problémem. Mám ViewModel, který má ObservableCollec­tion<TimeSpan> a potřebuju ho bindovat do nějakého ItemsControleru - např. ListView, kde DataTemplate bude TimePicker - nebo-li budu moct jednotlivé TimeSpan měnit.

Při zkoušce DataBind jedné property TimeSpan vše funguje jak má

protected TimeSpan timeTest;
       public TimeSpan TimeTest { get { return timeTest; } set { timeTest = value; SetProperty("TimeTest"); } }
<TimePicker Grid.Row="2" Time="{Binding TimeTest,Mode=TwoWay}"></TimePicker>

Při bindování kolekce, pro mě z neznámého důvodu to "někde samo" konvertuje na double. Takže mě napadlo udělat IValueConverter pro bindování do té DataTemplate

<DataTemplate>
                     <StackPanel>

                          <TimePicker Time="{Binding Converter={StaticResource DoubleToTimeSpanConverter}, Mode=TwoWay}"></TimePicker>
                         <TextBlock Text="{Binding Converter={StaticResource DoubleToTimeSpanConverter}}"></TextBlock>
                     </StackPanel>

                 </DataTemplate>

a daný Converter

class DoubleToTimeSpanConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, string language)
        {
            TimeSpan span = TimeSpan.FromSeconds((double) value);
            return span;
        }

        public object ConvertBack(object value, Type targetType, object parameter, string language)
        {
            TimeSpan span = (TimeSpan) value;
            return span.TotalSeconds;

        }
    }

Problém je s ConvertBack - targetType je double, value je TimeSpan (tj hodnota, která se předala z TimePickeru. Takže se mi nezdá, že bych vracel jinou hodnotu než je třeba.

Vždy to vyhodí následující chybu

Error: Cannot save value from target back to source. BindingExpression: Path='' DataItem='Windows.Foundation.IReference`1<Double>'; target element is 'Windows.UI.Xaml.Controls.TimePicker' (Name='null'); target property is 'Time' (type 'TimeSpan').

Pro nějaké nasměrování budu velmi vděčný. Podotýkám, že při jedné vlastnosti není třeba konverter a mode TwoWay funguje zcela korektně. Při bindování kolekce se to chová zvláštně. Díky moc za rady

Editováno 22.3.2015 22:56
Odpovědět
22.3.2015 22:55
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Petr Nymsa
Tvůrce
Avatar
Petr Nymsa:23.3.2015 18:02

Nechci spamovat, ale opravdu nikdo nic neví? Dost by mi to pomohlo. Bohužel jsem s tím vůbec nehnul

Nahoru Odpovědět
23.3.2015 18:02
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Odpovídá na Petr Nymsa
sadlomaslox25:23.3.2015 18:44

Nemuzes bindovat na kolekce ktere ubsahuji hodnotove typy. Vzdycky to musis zabalit. tzn.

List<WrapString> Data

kde class WrapString {
public string String{g;s}}

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
23.3.2015 18:44
Avatar
Petr Nymsa
Tvůrce
Avatar
Odpovídá na sadlomaslox25
Petr Nymsa:23.3.2015 18:59

Proč bych nemohl? Že mi binding na kolekce List<int>, List<string> fungují zcela v pořádku :)

Nahoru Odpovědět
23.3.2015 18:59
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na Petr Nymsa
Jan Vargovský:23.3.2015 19:34

Já teda souhlasím s kolegou sadlomaslox25. Co přesně ti funguje? OneWay binding ti funguje, ale twoway už nemůže. Jedine, že bys to bindoval na DP.

 
Nahoru Odpovědět
23.3.2015 19:34
Avatar
Odpovídá na Petr Nymsa
sadlomaslox25:23.3.2015 20:13

fungovat muzou max tak one way ale two way asi tezko :)

 
Nahoru Odpovědět
23.3.2015 20:13
Avatar
Petr Nymsa
Tvůrce
Avatar
Odpovídá na Jan Vargovský
Petr Nymsa:23.3.2015 23:10

Dobře, tak jak tedy vyřešit Binding TimeSpanu? Obalit ho ještě?

Nahoru Odpovědět
23.3.2015 23:10
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na Petr Nymsa
Jan Vargovský:23.3.2015 23:43

Je to asi nejrychlejší fix no.

 
Nahoru Odpovědět
23.3.2015 23:43
Avatar
Odpovídá na Petr Nymsa
sadlomaslox25:24.3.2015 9:05

no uprimne nechapu jak se ti podarilo rozjet tento radek
<TimePicker Time="{Binding Converter={Sta­ticResource DoubleToTimeS­panConverter}, Mode=TwoWay}"></Ti­mePicker>
kdyz me to vyhodi XamlParseException: "Two-way binding requires Path or XPath."

 
Nahoru Odpovědět
24.3.2015 9:05
Avatar
Petr Nymsa
Tvůrce
Avatar
Odpovídá na sadlomaslox25
Petr Nymsa:24.3.2015 9:13

Možná je dobré zmínit že se jedná o WinRT a ne WPF

Nahoru Odpovědět
24.3.2015 9:13
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Odpovídá na Petr Nymsa
sadlomaslox25:24.3.2015 9:27

No tak nejak sem si myslel ze to nebude WPF. Ale princip bude stejny. Ve WPF to ani nespustis a WinRT je "osekane" WPF takze tam to nejde ze stejneho duvodu jak ve WPF.

 
Nahoru Odpovědět
24.3.2015 9:27
Avatar
Petr Nymsa
Tvůrce
Avatar
Odpovídá na sadlomaslox25
Petr Nymsa:24.3.2015 10:01

Díky za radu, zdá se že to je opravdu řešení

Nahoru Odpovědět
24.3.2015 10:01
Pokrok nezastavíš, neusni a jdi s ním vpřed
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 12 zpráv z 12.