Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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}" />