Fungsi dalam x:Bind

Catatan

Untuk informasi umum tentang menggunakan pengikatan data di aplikasi Anda dengan {x:Bind} (dan untuk perbandingan all-up antara {x:Bind} dan {Binding}), lihat Pengikatan data secara mendalam dan {x:Bind} Markup Extension.

Mulai windows 10, versi 1607, {x:Bind} mendukung penggunaan fungsi sebagai langkah daun dari jalur pengikatan. Hal ini memungkinkan:

  • Cara yang lebih sederhana untuk mencapai konversi nilai
  • Cara agar pengikatan bergantung pada lebih dari satu parameter

Catatan

Untuk menggunakan fungsi dengan {x:Bind}, versi SDK target minimum aplikasi Anda harus 14393 atau yang lebih baru. Anda tidak dapat menggunakan fungsi saat aplikasi menargetkan versi Windows 10 yang lebih lama. Untuk informasi selengkapnya tentang versi target, lihat Kode adaptif versi.

Dalam contoh berikut, latar belakang dan latar depan item terikat ke fungsi untuk melakukan konversi berdasarkan parameter warna

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

Penggunaan atribut XAML

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

Jalur ke fungsi

Jalur ke fungsi ditentukan seperti jalur properti lainnya dan dapat menyertakan titik (.), pengindeks atau transmisi untuk menemukan fungsi.

Fungsi statis dapat ditentukan menggunakan sintaks XMLNamespace:ClassName.MethodName. Misalnya, gunakan sintaks di bawah ini untuk mengikat ke fungsi statis di 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;
    }
}

Anda juga dapat menggunakan fungsi sistem langsung dalam markup untuk mencapai skenario sederhana seperti pemformatan tanggal, pemformatan teks, perangkaian teks, dll., Misalnya:

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

Jika modenya adalah OneWay/TwoWay, maka jalur fungsi akan memiliki deteksi perubahan yang dilakukan di atasnya, dan pengikatan akan dievaluasi kembali jika ada perubahan pada objek tersebut.

Fungsi yang terikat untuk perlu:

  • Dapat diakses oleh kode dan metadata – sehingga pekerjaan internal /privat di C#, tetapi C++/CX akan membutuhkan metode untuk menjadi metode WinRT publik
  • Kelebihan beban didasarkan pada jumlah argumen, bukan jenis, dan akan mencoba mencocokkan dengan kelebihan beban pertama dengan banyak argumen
  • Jenis argumen perlu mencocokkan data yang diteruskan – kami tidak melakukan konversi yang mempersempit
  • Jenis pengembalian fungsi perlu cocok dengan jenis properti yang menggunakan pengikatan

Mesin pengikatan bereaksi terhadap pemberitahuan perubahan properti yang diaktifkan dengan nama fungsi dan mengevaluasi ulang pengikatan seperlunya. Contohnya:

<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

Anda dapat menggunakan fungsi dalam x:Bind untuk mencapai skenario yang sama dengan apa yang didukung melalui Pengonversi dan MultiBinding di WPF.

Argumen fungsi

Beberapa argumen fungsi dapat ditentukan, dipisahkan oleh koma (,)

  • Jalur Pengikatan – Sintaks yang sama seolah-olah Anda mengikat langsung ke objek tersebut.
    • Jika mode adalah OneWay/TwoWay, maka deteksi perubahan akan dilakukan dan pengikatan dievaluasi kembali setelah perubahan objek
  • String konstanta diapit dalam tanda kutip – tanda kutip diperlukan untuk menunjuknya sebagai string. Topi (^) dapat digunakan untuk menghindari tanda kutip dalam string
  • Nomor Konstanta - misalnya -123.456
  • Boolean – ditentukan sebagai "x:True" atau "x:False"

Pengikatan fungsi dua arah

Dalam skenario pengikatan dua arah, fungsi kedua harus ditentukan untuk arah terbalik pengikatan. Ini dilakukan menggunakan properti pengikatan BindBack . Dalam contoh di bawah ini, fungsi harus mengambil satu argumen yang merupakan nilai yang perlu didorong kembali ke model.

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

Baca juga