Dela via


Funktioner i x:Bind

Anmärkning

Allmän information om hur du använder databindning i din app med {x:Bind} (och en fullständig jämförelse mellan {x:Bind} och {Binding}), finns i Databindning på djupet och {x:Bind} Markup Extension.

Från och med Windows 10 version 1607 stöder {x:Bind} användningen av en funktion som slutsteg i bindningssökvägen. Detta aktiverar:

  • Ett enklare sätt att uppnå värdekonvertering
  • Ett sätt för bindningar att vara beroende av mer än en parameter

Anmärkning

Om du vill använda funktioner med {x:Bind}måste appens lägsta mål-SDK-version vara 14393 eller senare. Du kan inte använda funktioner när din app riktar in sig på tidigare versioner av Windows 10. Mer information om målversioner finns i Versionsanpassad kod.

I följande exempel är objektets bakgrund och förgrund bundna till funktioner för konvertering baserat på färgparametern

<DataTemplate x:DataType="local:ColorEntry">
    <Grid Background="{x:Bind local:ColorEntry.Brushify(Color), Mode=OneWay}" Width="240">
        <TextBlock Text="{x:Bind ColorName}" Foreground="{x:Bind TextColor(Color)}" Margin="10,5" />
    </Grid>
</DataTemplate>
class ColorEntry
{
    public string ColorName { get; set; }
    public Color Color { get; set; }

    public static SolidColorBrush Brushify(Color c)
    {
        return new SolidColorBrush(c);
    }

    public SolidColorBrush TextColor(Color c)
    {
        return new SolidColorBrush(((c.R * 0.299 + c.G * 0.587 + c.B * 0.114) > 150) ? Colors.Black : Colors.White);
    }
}

XAML-attributanvändning

<object property="{x:Bind pathToFunction.FunctionName(functionParameter1, functionParameter2, ...), bindingProperties}" ... />

Sökväg till funktionen

Den sökvägen till funktionen anges som andra egenskapssökvägar och kan innehålla punkter (.), indexerare eller casts för att hitta funktionen.

Statiska funktioner kan anges med XMLNamespace:ClassName.MethodName-syntax. Använd till exempel syntaxen nedan för bindning till statiska funktioner i code-behind.

<Page 
     xmlns:local="using:MyNamespace">
     ...
    <StackPanel>
        <TextBlock x:Name="BigTextBlock" FontSize="20" Text="Big text" />
        <TextBlock FontSize="{x:Bind local:MyHelpers.Half(BigTextBlock.FontSize)}" 
                   Text="Small text" />
    </StackPanel>
</Page>
namespace MyNamespace
{
    static public class MyHelpers
    {
        public static double Half(double value) => value / 2.0;
    }
}

Du kan också använda systemfunktioner direkt i markering för att utföra enkla scenarier som datumformatering, textformatering, textsammanfogningar osv., till exempel:

<Page 
     xmlns:sys="using:System"
     xmlns:local="using:MyNamespace">
     ...
     <CalendarDatePicker Date="{x:Bind sys:DateTime.Parse(TextBlock1.Text)}" />
     <TextBlock Text="{x:Bind sys:String.Format('{0} is now available in {1}', local:MyPage.personName, local:MyPage.location)}" />
</Page>

Om läget är OneWay/TwoWay utförs ändringsidentifiering på funktionssökvägen och bindningen utvärderas igen om det finns ändringar i objekten.

Funktionen som den kopplas till behöver:

  • Vara tillgänglig för koden och metadata – så internt/privat arbete i C#, men C++/CX behöver metoder för att vara offentliga WinRT-metoder
  • Överlagring baseras på antalet argument, inte typ, och det kommer att försöka matcha den första överlagringen med så många argument
  • Argumenttyperna måste matcha de data som skickas in – vi gör inte begränsade konverteringar
  • Returtypen för funktionen måste matcha typen av egenskap som använder bindningen

Bindningsmotorn reagerar på meddelanden om egenskapsändring som utlöses med funktionsnamnet och utvärderar bindningar om det behövs. Till exempel:

<DataTemplate x:DataType="local:Person">
   <StackPanel>
      <TextBlock Text="{x:Bind FullName}" />
      <Image Source="{x:Bind IconToBitmap(Icon, CancellationToken), Mode=OneWay}" />
   </StackPanel>
</DataTemplate>
public class Person : INotifyPropertyChanged
{
    //Implementation for an Icon property and a CancellationToken property with PropertyChanged notifications
    ...

    //IconToBitmap function is essentially a multi binding converter between several options.
    public Uri IconToBitmap (Uri icon, Uri cancellationToken)
    {
        Uri foo = new Uri(...);        
        if (isCancelled)
        {
            foo = cancellationToken;
        }
        else 
        {
            if (this.fullName.Contains("Sr"))
            {
               //pass a different Uri back
               foo = new Uri(...);
            }
            else
            {
                foo = icon;
            }
        }
        return foo;
    }

    //Ensure FullName property handles change notification on itself as well as IconToBitmap since the function uses it
    public string FullName
    {
        get { return this.fullName; }
        set
        {
            this.fullName = value;
            this.OnPropertyChanged ();
            this.OnPropertyChanged ("IconToBitmap"); 
            //this ensures Image.Source binding re-evaluates when FullName changes in addition to Icon and CancellationToken
        }
    }
}

Tips/Råd

Du kan använda funktioner i x:Bind för att uppnå samma scenarier som vad som stöds via Konverterare och MultiBinding i WPF.

Funktionsargument

Flera funktionsargument kan anges, avgränsade med kommatecken (,)

  • Bindningsväg – med samma syntax som om du binder direkt till objektet.
    • Om läget är OneWay/TwoWay utförs ändringsdetektion och bindningen utvärderas på nytt när objektet ändras.
  • Konstant sträng omgiven med citattecken – citattecken behövs för att ange den som en sträng. Hat (^) kan användas för att undkomma citattecken i strängar
  • Konstant tal – till exempel -123.456
  • Booleskt värde – anges som "x:True" eller "x:False"

Tips/Råd

TargetNullValue gäller för resultatet av funktionsanropet, inte för några bundna argument.

Tvåvägsfunktionsbindningar

I ett tvåvägsbindningsscenario måste en andra funktion anges för bindningens omvända riktning. Detta görs med hjälp av bindningsegenskapen BindBack. I exemplet nedan bör funktionen ta ett argument som är det värde som måste skickas tillbaka till modellen.

<TextBlock Text="{x:Bind a.MyFunc(b), BindBack=a.MyFunc2, Mode=TwoWay}" />

Se även