יש ב-Avalonia המון טריקים ופיצ'רים מגניבים, שרק בגללם שווה לבחור אותו (אפילו רק לחלונות), ככל שאני חופר עוד בפרויקט אני מוקסם מהגאונות שטמונה בו (עז"נ חכמה בגויים תאמין), הנה כמה קסמי Binding של Avalonia באמצעות קוד #C:
- הצמדה של Text Property מ-TextBox לתוכן הטקסט של TextBlock:
var textBox = new TextBox
{
Width = 100,
};
var textBlock = new TextBlock
{
Width = 100,
[!TextBlock.TextProperty] = textBox[!TextBox.TextProperty]
};
באמצעות שורה 9 חיברתי את textBox.Text
עם textBlock.Text
, כמה פשוט וקל!
- אותו רעיון בתוספת מניפולציה על הטקסט עם האופרטור
Select
:
var textBox = new TextBox();
var text = textBox.GetObservable(TextBox.TextProperty);
var textBlock = new TextBlock
{
[!TextBlock.TextProperty] = text.Select(x => x + x).ToBinding()
};
- אפשר גם להצמיד
Property
של פקד ישירות ל-Observable
כלשהו:
var source = new Subject<string>();
var textBlock = new TextBlock();
textBlock.Bind(TextBlock.TextProperty, source.AsObservable());
source.OnNext("Next 1");
await Task.Delay(1000);
source.OnNext(" Next 2");
בכל פעם שיגיע ערך מה-Observable הטקסט של הפקד ישתנה לערך החדש.
עד כאן זה היה בקוד #C, גם בתחביר xaml יש עוד המון פיצ'רים הנה כמה לדוגמא:
- הצמדה למאפיין בוליאני והפיכה של הערך עם האופרטור
!
:
{Binding MyProperty}
{Binding !MyProperty}
- הצמדה באמצעות שם של הפקד:
<TextBox Name="tb">
<TextBlock Text="{Binding #tb.Text}"/>
- הצמדה לפקד האב באמצעות הסימבול
parent$
:
<Border Tag="Hello World!">
<TextBlock Text="{Binding $parent.Tag}"/>
</Border>
אפשר גם באמצעות אינדקס:
<Border Tag="Hello World!">
<Border>
<TextBlock Text="{Binding $parent[1].Tag}"/>
</Border>
</Border>
ואפשר גם באמצעות הטייפ:
<Border Tag="Hello World!">
<Decorator>
<TextBlock Text="{Binding $parent[Border].Tag}"/>
</Decorator>
</Border>
ואפשר גם באמצעות טייפ ואינדקס:
<Border Tag="Hello World!">
<Border>
<Decorator>
<TextBlock Text="{Binding $parent[Border;1].Tag}"/>
</Decorator>
</Border>
</Border>
- הצמדת מאפיינים מסוג <IObservable<T באמצעות האופרטור
^
:
// ViewModel
public IObservable<string> Name {get; set; }
// xaml
<TextBlock Text="{Binding Name^.Length}"/>
- הצמדה למאפיינים א סינכרוניים, עם טקסט שמוצג לפני שהערך מוכן:
// ViewModel
public Task<string> MyAsyncText => GetTextAsync();
private async Task<string> GetTextAsync()
{
await Task.Delay(1000); // The delay is just for demonstration purpose
return "Hello from async operation";
}
// xaml
<TextBlock Text="{Binding MyAsyncText^, FallbackValue='Wait a second'}" />
בקיצור, תן לחכם ויחכם עוד, יש עוד הרבה דוגמאות שאפשר לראות בתיעוד.
יש הרבה סיבות טובות לבחור ב-Avalonia.