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

C# .NET .NET (C# a Visual Basic) Problém s DataBinding - TimeSpan vs kolekce<TimeSpan> American English version English version

Avatar
Petr Nymsa
Redaktor
Avatar
Petr Nymsa:

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
Redaktor
Avatar
Petr Nymsa:

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:

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í
+1 bodů
Řešení problému
 
Nahoru Odpovědět 23.3.2015 18:44
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na sadlomaslox25
Petr Nymsa:

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ý
Redaktor
Avatar
Odpovídá na Petr Nymsa
Jan Vargovský:

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:

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

 
Nahoru Odpovědět 23.3.2015 20:13
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na Jan Vargovský
Petr Nymsa:

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ý
Redaktor
Avatar
Odpovídá na Petr Nymsa
Jan Vargovský:

Je to asi nejrychlejší fix no.

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

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
Redaktor
Avatar
Odpovídá na sadlomaslox25
Petr Nymsa:

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:

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
Redaktor
Avatar
Odpovídá na sadlomaslox25
Petr Nymsa:

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.