Not
Åtkomst till denna sida kräver auktorisation. Du kan prova att logga in eller byta katalog.
Åtkomst till denna sida kräver auktorisation. Du kan prova att byta katalog.
Med WinUI-appar kan du använda funktioner som slutsteg i databindningssökvägen i {x:Bind}-markeringstillägget. Den här funktionen förenklar värdekonverteringen och gör att bindningar kan vara beroende av flera parametrar, vilket gör appen mer dynamisk och effektiv.
Tips/Råd
Allmän information om hur du använder databindning i din app med {x:Bind} (och för en fullständig jämförelse mellan {x:Bind} och {Binding}), finns i Databindning på djupet och {x:Bind} markeringstillägg.
I följande exempel är objektets bakgrund och förgrund bundna till funktioner som konverterar 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>
public 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
Ange sökvägen till funktionen precis som andra egenskapsvägar. Sökvägen kan innehålla punkter (.), indexerare eller casts för att hitta funktionen.
Använd syntaxen XMLNamespace:ClassName.MethodName för att ange statiska funktioner. Använd till exempel följande syntax för att binda till statiska funktioner i code-behind.
<Window
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>
</Window>
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 med mera. Till exempel:
<Window
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)}" />
</Window>
Om du ställer in läget på OneWay eller TwoWay stöder funktionssökvägen ändringsidentifiering. Bindningsmotorn utvärderar bindningen igen om dessa objekt ändras.
Den funktion som du binder till måste:
- Vara tillgänglig för koden och metadata – så interna eller privata fungerar i C#, men C++ behöver metoder för att vara offentliga WinRT-metoder
- Stöd för överlagring baserat på antalet argument, inte typ, och det försöker matcha den första överlagringen med så många argument
- Ha argumenttyper som matchar data som skickas in – bindningsmotorn utför inte begränsade konverteringar
- Ha en returtyp som matchar den typ 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)
{
var foo = new Uri(...);
if (isCancelled)
{
foo = cancellationToken;
}
else
{
if (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 fullName; }
set
{
fullName = value;
OnPropertyChanged();
OnPropertyChanged("IconToBitmap");
//this ensures Image.Source binding re-evaluates when FullName changes in addition to Icon and CancellationToken
}
}
}
Tips/Råd
Använd funktioner i x:Bind för att uppnå samma scenarier som vad som stöds via Konverterare och MultiBinding i WPF.
Funktionsargument
Ange flera funktionsargument avgränsade med kommatecken (,).
- Bindningssökväg – Använd samma syntax som om du skulle binda direkt till objektet.
- Om du ställer in läget på OneWay eller TwoWay identifierar bindningen ändringar och omvärderas när objektet ändras.
- Konstant sträng omgiven med citattecken – Inkludera citattecken för att ange den som en sträng. Använd hatten (^) för att undkomma citattecken i strängar.
- Konstant tal – till exempel -123.456.
- Booleskt värde – Ange som "x:True" eller "x:False".
Tips/Råd
TargetNullValue gäller för resultatet av funktionsanropet, inte för några bundna argument.
Dubbelriktade funktionsbindningar
I ett tvåvägsbindningsscenario måste du ange en andra funktion för bindningens omvända riktning. Använd bindningsegenskapen BindBack för den här funktionen. I följande exempel tar funktionen ett argument, vilket ä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
Windows developer