Aracılığıyla paylaş


x:Bind içindeki işlevler

Uyarı

{x:Bind} ile uygulamanızda veri bağlama kullanma hakkında genel bilgi için (ve {x:Bind} ile {Binding}arasında tam karşılaştırma için) bkz. Ayrıntılı veri bağlama ve {x:Bind} biçimlendirme uzantısı.

Windows 10, sürüm 1607'den itibaren {x:Bind} bağlama yolunun yaprak adımı olarak bir işlevin kullanılmasını destekler. Bu, şunları etkinleştirir:

  • Değer dönüştürmeyi başarmak için daha basit bir yol
  • Bağlamaların birden fazla parametreye bağlı olması için bir yol

Uyarı

İşlevleri {x:Bind} ile kullanmak için uygulamanızın en düşük hedef SDK sürümü 14393 veya üzeri olmalıdır. Uygulamanız Windows 10'un önceki sürümlerini hedeflediğinde işlevleri kullanamazsınız. Hedef sürümler hakkında daha fazla bilgi için bkz . Sürüm uyarlamalı kod.

Aşağıdaki örnekte, öğenin arka planı ve ön planı renk parametresine göre dönüştürme yapmak için işlevlere bağlıdır

<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 öznitelik kullanımı

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

İşlevin yolu

İşlev yolu, diğer özellik yolları gibi belirtilir ve işlevi bulmak için veya yayınları (.), dizin oluşturucuları nokta içerebilir.

Statik işlevler XMLNamespace:ClassName.MethodName söz dizimi kullanılarak belirtilebilir. Örneğin, arka planda statik işlevlere bağlanmak için aşağıdaki söz dizimini kullanın.

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

Tarih biçimlendirmesi, metin biçimlendirmesi, metin birleştirmeleri vb. gibi basit senaryoları gerçekleştirmek için sistem işlevlerini doğrudan işaretlemede de kullanabilirsiniz. Örneğin:

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

Mod OneWay/TwoWay ise, işlev yolunda değişiklikler algılanır ve bu nesnelerde değişiklik olduğunda bağlantı yeniden değerlendirilir.

Bağlı olan işlevin aşağıdakileri yapması gerekir:

  • Kod ve meta verilere erişiminiz olsun; bu nedenle C# dilinde iç/özel çalışmalar gerekliyken, C++/CX için WinRT yöntemlerinin genel olması gerekir.
  • Aşırı yükleme, türe değil bağımsız değişkenlerin sayısına bağlıdır ve bu kadar çok bağımsız değişkenle ilk aşırı yüklemeyle eşleşmeyi dener
  • Bağımsız değişken türlerinin geçirilmekte olan verilerle eşleşmesi gerekir; kapsamı daraltma dönüşümleri yapmayız.
  • İşlevin dönüş türünün bağlamayı kullanan özelliğin türüyle eşleşmesi gerekir

Bağlama altyapısı işlev adıyla tetiklenen özellik değişikliği bildirimlerine tepki gösterir ve gerektiğinde bağlamaları yeniden değerlendirir. Örneğin:

<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

Wpf'de Dönüştürücüler ve MultiBinding aracılığıyla desteklenen senaryolarla aynı senaryoları elde etmek için x:Bind içindeki işlevleri kullanabilirsiniz.

Fonksiyon argümanları

Virgülle (,) ayırarak birden çok işlev bağımsız değişkeni belirtilebilir

  • Bağlama Yolu – Doğrudan bu nesneye bağlanmış olmanızla aynı söz dizimi.
    • Mod OneWay/TwoWay ise değişiklik algılama gerçekleştirilir ve nesne değişiklikleri üzerine bağlama yeniden değerlendirilir
  • Tırnak içine alınmış sabit metin – bunun bir dize olduğunu belirtmek için tırnak işaretleri gereklidir. Hat (^) dizelerdeki tırnak işaretlerinden kaçmak için kullanılabilir
  • Sabit Sayı - örneğin -123.456
  • Boole : "x:True" veya "x:False" olarak belirtilir

Tip

TargetNullValue herhangi bir bağlı bağımsız değişkene değil işlev çağrısının sonucuna uygulanır.

İki yönlü fonksiyon bağlamaları

İki yönlü bağlama senaryosunda bağlamanın ters yönü için ikinci bir işlev belirtilmelidir. Bu, BindBack bağlama özelliği kullanılarak yapılır. Aşağıdaki örnekte işlev, modele geri itilecek değer şeklinde bir bağımsız değişken almalıdır.

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

Ayrıca bakınız