تقدم المقالة مناهج معممة لاستخدامها عند كتابة XAMLكود.

IValueConverterData BindingXAMLWPFUWPXamarin FormsUISwitchConverterKeyToValueConverterInlineConverterAggregateConverterResourceDictionary
جنبا إلى جنب مع محرك ربط البيانات هي مكونات مهمة في تطوير واجهات المستخدم على أساس XAML. تشير محولات القيمة إلى وجود منطق في فئة منفصلة تقوم بتنفيذ الواجهة IValueConverter. عادةً ما يعكس اسم الفئة الوظيفة ، ويتم الإعلان عن المثيلات في الترميز.
محول التبديل & مفتاح لتحويل القيمة
في الممارسة العملية ، العديد من المحولات لها قيم منطقية تافهة مماثلة في الهيكل (?:) أو التصميمات if-else، switch-case-default. ومع ذلك، هناك تعميم النماذج KeyToValueConverter و SwitchConverterالتي تسمح لك لتجنب إضافة فئات من نفس النوع في هيكل إلى المشروع عن طريق إعلان القيم المنطقية وفروع مباشرة في الترميز.
مفهوم
<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>تطبيق
<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
من المفيد وضع محولات القيمة العامة في قاموس موارد منفصل ، ثم دمجها كمصادر عامة في ملف App.xaml. يسمح لك هذا بإعادة استخدام محولات القيمة في تمثيلات مختلفة دون إعادة التصريح عنها.
<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>إطار Ace
أمثلة على تنفيذ المحولات عرض يمكن العثور عليها في Ace Framework gitlab bitbucket مكتبة
مع الامتنان لاهتمامكم واهتمامكم!