Artikel ini menyajikan pendekatan umum untuk digunakan saat menulis XAML-code.

IValueConverterData BindingXAMLWPFUWPXamarin FormsUISwitchConverterKeyToValueConverterInlineConverterAggregateConverterResourceDictionary
bersama-sama dengan mesin pengikat data merupakan komponen penting dalam pengembangan antarmuka pengguna berdasarkan XAML. Pengonversi nilai menyiratkan keberadaan logika di kelas terpisah yang mengimplementasikan antarmuka IValueConverter. Biasanya, nama kelas mencerminkan tujuan fungsional, dan contoh dideklarasikan dalam markup.
Beralih Converter & Key To Value Converter
Dalam praktiknya, banyak konverter memiliki nilai logika sepele yang mirip dalam struktur (?:) atau desain if-else, switch-case-default. Namun, ada template umum KeyToValueConverter dan SwitchConverteryang memungkinkan Anda menghindari penambahan kelas dengan tipe yang sama dalam struktur ke proyek dengan mendeklarasikan nilai boolean dan cabang langsung di markup.
Konsep
<KeyToValueConverter
Key="KeyForMatching"
Value="ValueIfKeyMatched"
ByDefault="ValueIfKeyNotMatched" />
<SwitchConverter
ByDefault="ValueZ">
<Case
Key="KeyA"
Value="ValueA" />
<Case
Key="KeyB"
Value="ValueB" />
<Case
Key="KeyC"
Value="ValueC" />
</SwitchConverter>Aplikasi
<KeyToValueConverter
x:Key="TrueToVisibleConverter"
Key="True"
Value="Visible"
ByDefault="Collapsed" />
<ProgressBar
Visibility="{Binding IsBusy, Converter={StaticResource TrueToVisibleConverter}}" /><SwitchConverter
x:Key="CodeToBackgroundConverter"
ByDefault="White">
<Case
Key="R"
Value="Red" />
<Case
Key="G"
Value="Green" />
<Case
Key="B"
Value="Blue" />
</SwitchConverter>
<Control
Background="{Binding Code, Converter={StaticResource CodeToBackgroundConverter}}" />KeyToValueConverter - Key, , Value, ByDefault.
SwitchConverter - Case Key, Case , ¨C31C, ¨C90C¨C32C, .
Value ByDefault , , .
KeyToValueConverter ConverterParameter KeySource
<KeyToValueConverter
x:Key="EqualsToHiddenConverter"
KeySource="ConverterParameter"
Value="Collapsed"
ByDefault="Visible" />
<Control
Visiblity="{Binding Items.Count, ConverterParameter=0, Converter={StaticResource EqualsToHiddenConverter}}" />
<TextBlock
Visiblity="{Binding Text, ConverterParameter='Hide Me', Converter={StaticResource EqualsToHiddenConverter}}" /> KeySource :
Manual (by default) - Key ,
ConverterParameter - ConverterParameter ,
PreferManual - manual Key , ConverterParameter
PreferConverterParameter - ConverterParameter , manual Key
, SwitchConverter Case TypedCase,
<SwitchConverter
ByDefault="Undefined value">
<TypedCase
Key="system:String"
Value="String value" />
<Case
Key="0"
Value="Zero" />
<Case
Key="1"
Value="One" />
<TypedCase
Key="system:Int32"
Value="Int32 value" />
</SwitchConverter> . SwitchConverter DiagnosticKey, , Trace
var diagnosticMessage = matchedCase.Is()
? $"{DiagnosticKey}: '{matchedValue}' matched by key '{matchedCase.Key}' for '{value}' and converted to '{convertedValue}'"
: $"{DiagnosticKey}: The default value '{matchedValue}' matched for '{value}' and converted to '{convertedValue}'";
Trace.WriteLine(diagnosticMessage);<SwitchConverter
DiagnosticKey="UniqDiagnosticKey"
x:Key="CodeToBackgroundConverter"
ByDefault="White">
...
</SwitchConverter>Dependency Value Converter
Key, Value ByDefault (Dependency Properties), Cases DependencyObject. , , Binding,
<KeyToValueConverter
Key="AnyKey"
Value="{Binding MatchedValue, Source={StaticResource AnyResource}}"
ByDefault="{Binding DefaultValue, Source={StaticResource AnyResource}}" />
<KeyToValueConverter
Key="AnyKey"
Value="{Localizing MatchedTitle}"
ByDefault="{Localizing DefaultTitle}" />Inline Converter
, IValueConverter, code-behind .
, .
, code-behind Converting ConvertingBack
<Grid>
<Grid.Resources>
<InlineConverter
x:Key="ComplexInlineConverter"
Converting="InlineConverter_OnConverting"
ConvertingBack="InlineConverter_OnConverting" />
</Grid.Resources>
<TextBlock
Text="{Binding Number, Converter={StaticResource InlineConverter}}"/>
</Grid>private void InlineConverter_OnConverting(object sender, ConverterEventArgs e)
{
// e.Value - access to input value
// this.DataContext - access to Data Context or another properties of the view
// access to child visual elements of this root view
e.ConvertedValue = // set output value
$"DataContext: {DataContext}, Converter Value: {e.Value}";
}
private void InlineConverter_OnConvertingBack(object sender, ConverterEventArgs e)
{
// ...
}Aggregate Converter
, .
<AggregateConverter>
<StepAConverter />
<StepBConverter />
<StepCConverter />
</AggregateConverter>App.xaml
Berguna untuk menempatkan konverter nilai generik dalam Kamus Sumber Daya terpisah dan kemudian menggabungkannya sebagai sumber daya global dalam file App.xaml. Ini memungkinkan Anda untuk menggunakan kembali pengonversi nilai dalam representasi yang berbeda tanpa mendeklarasikannya kembali.
<Application
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Any.App">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary
Source="AppConverters.xaml" />
...
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>Kerangka Ace
Contoh pelaksanaan konverter disajikan dapat ditemukan di Ace Framework gitlab bitbucket perpustakaan
Dengan terima kasih atas perhatian dan minatnya!