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 @@
+
+
+
+
+
+
+
+
+
+
+
+ {
+
+
+ }
+
+
+
+
+