Der Artikel enthält allgemeine Ansätze zum
Schreiben von XAML
Code.
IValueConverter
Data Binding
XAML
WPF
UWP
Xamarin Forms
UI
SwitchConverter
KeyToValueConverter
InlineConverter
AggregateConverter
ResourceDictionary
zusammen mit der Datenbindungs-Engine sind wichtige Komponenten bei der Entwicklung von Benutzeroberflächen basierend auf XAML
. Wertkonverter implizieren das Vorhandensein von Logik in einer separaten Klasse, die die Schnittstelle implementiert IValueConverter
. In der Regel spiegelt der Klassenname den Funktionszweck wider, und die Instanzen werden im Markup deklariert.
Konverter & Schlüssel auf Wertkonverter umschalten
In der Praxis haben viele Wandler triviale Logikwerte, die in ihrer Struktur (?:)
oder ihrem Design ähnlich if-else
sind switch-case-default
. Allerdings gibt es Vorlagen verallgemeinert KeyToValueConverter
und SwitchConverter
dass können Sie das Projekt Hinzufügen von Klassen des gleichen Typs in der Struktur zu vermeiden , indem Boolesche Werte und Zweige direkt im Markup zu deklarieren.
Konzept
<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>
Anwendung
<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
), Case
s 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
Es ist nützlich, generische Wertkonverter in einem separaten Ressourcenwörterbuch abzulegen und sie dann als globale Ressourcen in der Datei App.xaml zusammenzuführen. Auf diese Weise können Sie Wertkonverter in verschiedenen Darstellungen wiederverwenden, ohne sie erneut zu deklarieren.
<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 Framework
Beispiele für die Implementierung der vorgestellten Konverter finden Sie in der Ace Framework
gitlab- Bitbucket- Bibliothek
Mit Dankbarkeit für Ihre Aufmerksamkeit und Ihr Interesse!