Not
Å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.
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