diff --git a/src/Avalonia.Diagnostics/Diagnostics/ViewModels/BindingSetterViewModel.cs b/src/Avalonia.Diagnostics/Diagnostics/ViewModels/BindingSetterViewModel.cs new file mode 100644 index 0000000000..de3e56e514 --- /dev/null +++ b/src/Avalonia.Diagnostics/Diagnostics/ViewModels/BindingSetterViewModel.cs @@ -0,0 +1,51 @@ +using System; +using Avalonia.Data; +using Avalonia.Markup.Xaml.MarkupExtensions; +using Avalonia.Media; + +namespace Avalonia.Diagnostics.ViewModels +{ + internal class BindingSetterViewModel : SetterViewModel + { + public BindingSetterViewModel(AvaloniaProperty property, object? value) : base(property, value) + { + switch (value) + { + case Binding binding: + Path = binding.Path; + Tint = Brushes.CornflowerBlue; + + break; + case CompiledBindingExtension binding: + Path = binding.Path.ToString(); + Tint = Brushes.DarkGreen; + + break; + case TemplateBinding binding: + if (binding.Property is AvaloniaProperty templateProperty) + { + Path = $"{templateProperty.OwnerType.Name}.{templateProperty.Name}"; + } + else + { + Path = "Unassigned"; + } + + Tint = Brushes.OrangeRed; + + break; + default: + throw new ArgumentException("Invalid binding type", nameof(value)); + } + } + + public IBrush Tint { get; } + + public string Path { get; } + + public override void CopyValue() + { + CopyToClipboard(Path); + } + } +} diff --git a/src/Avalonia.Diagnostics/Diagnostics/ViewModels/ControlDetailsViewModel.cs b/src/Avalonia.Diagnostics/Diagnostics/ViewModels/ControlDetailsViewModel.cs index 8f0a4d07b0..701947d2ab 100644 --- a/src/Avalonia.Diagnostics/Diagnostics/ViewModels/ControlDetailsViewModel.cs +++ b/src/Avalonia.Diagnostics/Diagnostics/ViewModels/ControlDetailsViewModel.cs @@ -8,6 +8,7 @@ using System.Reflection; using Avalonia.Collections; using Avalonia.Controls; using Avalonia.Controls.Metadata; +using Avalonia.Data; using Avalonia.Markup.Xaml.MarkupExtensions; using Avalonia.Styling; using Avalonia.VisualTree; @@ -87,7 +88,16 @@ namespace Avalonia.Diagnostics.ViewModels } else { - setterVm = new SetterViewModel(regularSetter.Property, setterValue); + var isBinding = IsBinding(setterValue); + + if (isBinding) + { + setterVm = new BindingSetterViewModel(regularSetter.Property, setterValue); + } + else + { + setterVm = new SetterViewModel(regularSetter.Property, setterValue); + } } setters.Add(setterVm); @@ -117,6 +127,19 @@ namespace Avalonia.Diagnostics.ViewModels return null; } + private bool IsBinding(object? value) + { + switch (value) + { + case Binding: + case CompiledBindingExtension: + case TemplateBinding: + return true; + } + + return false; + } + public TreePageViewModel TreePage { get; } public DataGridCollectionView? PropertiesView diff --git a/src/Avalonia.Diagnostics/Diagnostics/ViewModels/SetterViewModel.cs b/src/Avalonia.Diagnostics/Diagnostics/ViewModels/SetterViewModel.cs index 38cbefcb93..559ed49911 100644 --- a/src/Avalonia.Diagnostics/Diagnostics/ViewModels/SetterViewModel.cs +++ b/src/Avalonia.Diagnostics/Diagnostics/ViewModels/SetterViewModel.cs @@ -34,7 +34,7 @@ namespace Avalonia.Diagnostics.ViewModels IsVisible = true; } - public void CopyValue() + public virtual void CopyValue() { var textToCopy = Value?.ToString(); diff --git a/src/Avalonia.Diagnostics/Diagnostics/Views/ControlDetailsView.xaml b/src/Avalonia.Diagnostics/Diagnostics/Views/ControlDetailsView.xaml index d7acbbd577..ec97b213a9 100644 --- a/src/Avalonia.Diagnostics/Diagnostics/Views/ControlDetailsView.xaml +++ b/src/Avalonia.Diagnostics/Diagnostics/Views/ControlDetailsView.xaml @@ -138,6 +138,26 @@ + + + + + + + + + + + + { + + + } + + + + +