Avatar billede Slettet bruger
31. maj 2010 - 19:46 Der er 13 kommentarer og
1 løsning

WPF binding

Jeg har følgende dependencyproperty på min custom control:

public FPSTimeSpan TimeCodeStartTime
{
    get { return (FPSTimeSpan)GetValue(TimeCodeStartTimeProperty); }
    set { SetValue(TimeCodeStartTimeProperty, value); }
}
public static readonly DependencyProperty TimeCodeStartTimeProperty = DependencyProperty.Register("TimeCodeStartTime", typeof(FPSTimeSpan), typeof(TitleBox), new UIPropertyMetadata(null));

FPSTimeSpan klassen har en overrided ToString

I min controltemplate forsøger jeg at hente værdien af den property:

<TextBlock Name="PART_TimeCodeInText" DataContext="{Binding Path=TimeCodeStartTime}">
                                    <TextBlock.Text>
                                        <Binding Converter="{StaticResource conv}" />
                                    </TextBlock.Text>
                                </TextBlock>


Med følgende converter:

public class FPSTimeSpanConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return ((FPSTimeSpan)value).ToString();
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotSupportedException("Cannot convert back");
        }
    }

Hvorfor kan jeg ikke få værdien ud? jeg har prøvet ALLE tænkelige måder at binde det lort på men det virker ikke! som altid i WPF skal man rodde med de mest simple ting i MANGE TIMER for at få det til at virke, WHY!?
Avatar billede Syska Mester
31. maj 2010 - 20:52 #1
1. Fordi man ikke altid helt forstår hvordan WPF virker, derfor de mange timer.

Som jeg lige ser det ... så sætter du kun DataContext, men ingen steder sætter du at du vil bind til netop den property.
Avatar billede Syska Mester
31. maj 2010 - 20:54 #2
DataContext kan jo være alt ... lister eller et enkelt element.

Sikker på du ikke skal sætte Text/Content property på din TextBlock ?

og så er det måske lidt overkill at sætte din DataContext for et enkelt element.

mvh
Avatar billede Slettet bruger
31. maj 2010 - 20:57 #3
Hej

Når jeg ikke sætter datacontext, prøver den at finde værdien i den form som min usercontrol nu ligger i.

"Sikker på du ikke skal sætte Text/Content property på din TextBlock ?"

Det gør jeg også her:
<TextBlock.Text>
    <Binding Converter="{StaticResource conv}" />
</TextBlock.Text>
Avatar billede Syska Mester
31. maj 2010 - 21:39 #4
og hvad sker der når du debugger igennem det? Kommer du ind i din converter?

Nu er det ved at være lang tid siden jeg legede med WPF, men mindes ikke at det er Content du sætter der, men kun hvad converter der skal bruges, og siden du ikke sætter Content, hvad skal den så convert ...

Som sagt ... jeg kan tage fejl.
Avatar billede Slettet bruger
31. maj 2010 - 22:34 #5
Der er ikke content i en textblock, kun text.

Som det er nu kommer jeg ind i min converter, men value er NULL
Avatar billede Slettet bruger
31. maj 2010 - 23:07 #6
Okay, jeg behøvede åbenbart slet ikke en converter:

{Binding RelativeSource={RelativeSource TemplatedParent}, Path=TimeCodeStartTime}
Avatar billede Syska Mester
31. maj 2010 - 23:28 #7
Igen, vil jeg påstå at du ikke har lavet en binding til din Data i dit forige eksempele.

Binding burde også have en Path

Nu har du netop sat din Path, som er stien til din data.

Men hvordan ser hele din binding så ud nu ?
Avatar billede Slettet bruger
31. maj 2010 - 23:31 #8
Ser sådan ud:
<TextBlock Name="PART_TimeCodeInText" Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=TimeCodeStartTime}"/>

Path har intet at sige, da det er implicit.
Avatar billede Syska Mester
01. juni 2010 - 00:00 #9
Men nu har du jo også gjort som jeg sagde i starten.

At du skulle bind til din Text/Content property på din TextBlock, men jeg er da glad for at du fik det til at virke.
Avatar billede Syska Mester
01. juni 2010 - 00:05 #10
I dir første forsøg satte du bare Converteren for din TextBlock.Text property, men ingen value.
Avatar billede Slettet bruger
01. juni 2010 - 00:19 #11
Det er jo ligegyldigt om jeg bruger text property eller:

<TextBlock.Text>
</TextBlock.Text>

Resultatet er nøjagtig det samme, problemet var at jeg skulle binde mod RelativeSource={RelativeSource TemplatedParent}
Avatar billede Syska Mester
01. juni 2010 - 00:29 #12
Ja ... 100%, også det jeg skriver.

Men det nytter jo ikke du ikke binder til noget data, men kun converteren. Derfor er det jo klart din data er null.

Men kan ske at jeg tager fejl ... men overstående tanker omkring dit problem, men jeg synes det virker ydest logisk at det ikke virkede.

WPF er dejligt simpelt.
Avatar billede Slettet bruger
01. juni 2010 - 00:31 #13
Datacontext burde netop pege på det korrekte object. Men da jeg arbejdede i en template og ikke en control, var jeg nød til at pege på templatens parent og altså dens control
Avatar billede Syska Mester
01. juni 2010 - 00:40 #14
Lige ved og næsten slår ingen mand af hesten.

Nu kom du jo også frem med hvorfor det ikke virkede og nu kan jeg følge din forklaring. Der var også et par ord om template jeg var sprunget gladeligt henover, men det mener jeg også at have læst i den del blogs, at den del omkirng WPF godt kan være lidt mærkelig.

Men ikke distro mindre var min antagelse i starten rigtig ... :-) Text blev ikke sat :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester