Sdílet prostřednictvím


Funkce v x:Bind

Poznámka:

Obecné informace o používání datových vazeb v aplikaci s {x:Bind} a pro porovnání {x:Bind} a {Binding} naleznete v tématu „Datové vazby podrobně“ a {x:Bind} rozšíření značek.

Počínaje Windows 10 verze 1607, {x:Bind} podporuje použití funkce jako posledního kroku vazební cesty. To umožňuje:

  • Jednodušší způsob, jak dosáhnout převodu hodnot
  • Způsob, jak mohou vazby záviset na více než jednom parametru

Poznámka:

Pokud chcete používat funkce s {x:Bind}, minimální cílová verze sady SDK vaší aplikace musí být 14393 nebo novější. Funkce nemůžete použít, když vaše aplikace cílí na starší verze Windows 10. Další informace o cílových verzích najdete v části adaptivní kód verze.

V následujícím příkladu jsou pozadí a popředí položky vázány na funkce k převodu na základě barevného parametru.

<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);
    }
}

Použití atributu XAML

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

Cesta k funkci

Cesta k funkci je zadaná stejně jako jiné cesty vlastností a může obsahovat tečky (.), indexery nebo přetypování pro nalezení funkce.

Statické funkce lze zadat pomocí syntaxe XMLNamespace:ClassName.MethodName. Použijte například následující syntaxi pro vazbu na statické funkce v kódu.

<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;
    }
}

Systémové funkce můžete také použít přímo v revizích k provádění jednoduchých scénářů, jako je formátování kalendářních dat, formátování textu, zřetězení textu atd., například:

<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>

Pokud je režim OneWay/TwoWay, cesta funkce bude mít provedenou detekci změn a vazba se znovu vyhodnotí, pokud dojde k změnám těchto objektů.

Funkce, na kterou je vázáno, musí splňovat:

  • Přístup k kódu a metadatům – proto interní a soukromá práce v jazyce C#, ale jazyk C++/CX bude potřebovat metody pro veřejné metody WinRT.
  • Přetížení je založeno na počtu argumentů, nikoli typu, a snaží se odpovídat prvnímu přetížení s daným počtem argumentů.
  • Typy argumentů musí odpovídat předávaným datům – neprovádíme omezující konverze.
  • Návratový typ funkce musí odpovídat typu vlastnosti, která používá vazbu.

Modul vazeb reaguje na oznámení o změnách vlastností aktivovaných názvem funkce a podle potřeby znovu vyhodnotí vazby. Například:

<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
        }
    }
}

Tip

Pomocí funkcí v x:Bind můžete dosáhnout stejných scénářů, jaké byly podporovány prostřednictvím převaděčů a multibindingu ve WPF.

Argumenty funkce

Je možné zadat více argumentů funkce oddělené čárkami (,).

  • Cesta navázání – stejná syntaxe jako při přímém navázání na tento objekt.
    • Pokud je režim OneWay/TwoWay, provede se detekce změn a vazba se znovu vyhodnotí při změnách objektu.
  • Konstantní řetězec uzavřený v uvozovkách – k jeho určení jako řetězec jsou potřeba uvozovky. Hat (^) lze použít pro odstranění efektu uvozovek v řetězcích.
  • Konstantní číslo – například -123,456
  • Logická hodnota – zadaná jako x:True nebo x:False

Tip

TargetNullValue se použije na výsledek volání funkce, ne na žádné vázané argumenty.

Dvoucestné vazby funkcí

Ve dvoucestném scénáři vazby musí být pro opačný směr vazby zadána druhá funkce. To se provádí pomocí vlastnosti vazby BindBack. V následujícím příkladu by funkce měla mít jeden argument, což je hodnota, kterou je potřeba vrátit zpět do modelu.

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

Viz také

  • Rozšíření značek {x:Bind}