using Avalonia;
using Avalonia.Controls;
using Avalonia.Data;
using Avalonia.Data.Converters;
using Avalonia.Markup.Xaml;
using Avalonia.Markup.Xaml.MarkupExtensions;
using System;
using System.Collections.Generic;
using System.Globalization;
namespace ShakerApp
{
///
/// 多语言绑定时使用,没有其他任何功能
///
public class ResourceBindingExtensions
{
public static readonly AttachedProperty BindingExtensionProperty = AvaloniaProperty.RegisterAttached("BindingExtension", typeof(Control), defaultValue: null);
public static object? GetBindingExtension(Control control) => control.GetValue(BindingExtensionProperty);
public static void SetBindingExtension(Control control, object? value) => control.SetValue(BindingExtensionProperty, value);
}
public class ResourceBinding : MarkupExtension
{
private PathConverter converter = new PathConverter();
public ResourceBinding(string path)
{
this.Path = path;
}
public override object ProvideValue(IServiceProvider serviceProvider)
{
var provideValueTargetService = (IProvideValueTarget)serviceProvider.GetService(typeof(IProvideValueTarget))!;
var targetObject = provideValueTargetService.TargetObject as Control;
var targetProperty = provideValueTargetService.TargetProperty as AvaloniaProperty;
if (targetObject == null || targetProperty == null) return null;
Binding binding = new Binding()
{
Path = Path,
Converter = converter,
ConverterParameter = new KeyValuePair(targetObject,targetProperty),
Mode = BindingMode.OneWay,
UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged,
};
targetObject.Bind(ResourceBindingExtensions.BindingExtensionProperty, binding);
return null;
}
///
/// The source path (for CLR bindings).
///
public string Path { get; set; }
private class PathConverter : IValueConverter
{
public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture)
{
if (parameter is KeyValuePair p && value is string v)
{
p.Key.Bind(p.Value, new DynamicResourceExtension(v));
}
return "";
}
public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
}
}