wieslawsoltes / Dock

A docking layout system.
https://wieslawsoltes.github.io/Dock/
MIT License
933 stars 96 forks source link

Binding to attached Proportion property does not work #47

Closed wieslawsoltes closed 5 years ago

wieslawsoltes commented 6 years ago

When using custom namespace like xmlns:ac="clr-namespace:Avalonia.Controls;assembly=Dock.Avalonia" setting attached property in style setter result in exception.

https://github.com/wieslawsoltes/Dock/blob/ad337ebb8318f52b023b1f5dd7b62d78112fd90d/src/Dock.Avalonia/Controls/DockControl.xaml#L36-L41

<ItemsControl.Styles>
    <Style Selector="ItemsControl > ContentPresenter">
        <Setter Property="ac:ProportionalStackPanelSplitter.Proportion" Value="{Binding Proportion}"/>
    </Style>
</ItemsControl.Styles>
/// <summary>
/// Defines the Proportion attached property.
/// </summary>
public static readonly AttachedProperty<double> ProportionProperty =
    AvaloniaProperty.RegisterAttached<ProportionalStackPanelSplitter, IControl, double>("Proportion", double.NaN);

/// <summary>
/// Gets the value of the Proportion attached property on the specified control.
/// </summary>
/// <param name="control">The control.</param>
/// <returns>The Proportion attached property.</returns>
public static double GetProportion(IControl control)
{
    return control.GetValue(ProportionProperty);
}

/// <summary>
/// Sets the value of the Proportion attached property on the specified control.
/// </summary>
/// <param name="control">The control.</param>
/// <param name="value">The value of the Dock property.</param>
public static void SetProportion(IControl control, double value)
{
    control.SetValue(ProportionProperty, value);
}
Could not convert object 'ac:ProportionalStackPanelSplitter.Proportion' (of type System.String) to {clr-namespace:Avalonia;assembly=Avalonia.Base}AvaloniaProperty: Attached properties not supported.
   at Portable.Xaml.XamlObjectWriterInternal.GetCorrectlyTypedValue(XamlMember xm, XamlType xt, Object value) in C:\projects\Avalonia\src\Markup\Avalonia.Markup.Xaml\PortableXaml\portable.xaml.github\src\Portable.Xaml\Portable.Xaml\XamlObjectWriter.cs:line 694
   at Portable.Xaml.XamlObjectWriterInternal.StoreAppropriatelyTypedValue(ObjectState state, MemberAndValue ms, Object obj, Object keyObj) in C:\projects\Avalonia\src\Markup\Avalonia.Markup.Xaml\PortableXaml\portable.xaml.github\src\Portable.Xaml\Portable.Xaml\XamlObjectWriter.cs:line 620
   at Portable.Xaml.XamlObjectWriterInternal.OnWriteValue(Object value) in C:\projects\Avalonia\src\Markup\Avalonia.Markup.Xaml\PortableXaml\portable.xaml.github\src\Portable.Xaml\Portable.Xaml\XamlObjectWriter.cs:line 573
   at Portable.Xaml.XamlServices.Transform(XamlReader xamlReader, XamlWriter xamlWriter, Boolean closeWriter) in C:\projects\Avalonia\src\Markup\Avalonia.Markup.Xaml\PortableXaml\portable.xaml.github\src\Portable.Xaml\Portable.Xaml\XamlServices.cs:line 128
   at Avalonia.Markup.Xaml.AvaloniaXamlLoader.LoadFromReader(XamlReader reader, AvaloniaXamlContext context, IAmbientProvider parentAmbientProvider) in C:\projects\Avalonia\src\Markup\Avalonia.Markup.Xaml\AvaloniaXamlLoader.cs:line 208
   at Avalonia.Markup.Xaml.Templates.TemplateContent.Load() in C:\projects\Avalonia\src\Markup\Avalonia.Markup.Xaml\Templates\TemplateContent.cs:line 35
   at Avalonia.Controls.Presenters.ContentPresenter.CreateChild() in C:\projects\Avalonia\src\Avalonia.Controls\Presenters\ContentPresenter.cs:line 305
   at Avalonia.Controls.Presenters.ContentPresenter.UpdateChild() in C:\projects\Avalonia\src\Avalonia.Controls\Presenters\ContentPresenter.cs:line 222
   at Avalonia.Controls.Presenters.ContentPresenter.ContentChanged(AvaloniaPropertyChangedEventArgs e) in C:\projects\Avalonia\src\Avalonia.Controls\Presenters\ContentPresenter.cs:line 414
   at System.Reactive.Observer`1.OnNext(T value)
   at Avalonia.AvaloniaObject.RaisePropertyChanged(AvaloniaProperty property, Object oldValue, Object newValue, BindingPriority priority) in C:\projects\Avalonia\src\Avalonia.Base\AvaloniaObject.cs:line 527
   at Avalonia.AvaloniaObject.Avalonia.IPriorityValueOwner.Changed(AvaloniaProperty property, Int32 priority, Object oldValue, Object newValue) in C:\projects\Avalonia\src\Avalonia.Base\AvaloniaObject.cs:line 432
   at Avalonia.PriorityValue.<>c__DisplayClass27_0.<UpdateCore>b__0() in C:\projects\Avalonia\src\Avalonia.Base\PriorityValue.cs:line 284
   at Avalonia.Utilities.DeferredSetter`2.<>c__DisplayClass9_0`1.<SetAndNotify>b__0(Action notification) in C:\projects\Avalonia\src\Avalonia.Base\Utilities\DeferredSetter.cs:line 133
   at Avalonia.PriorityValue.UpdateCore(ValueTuple`2 update, ValueTuple`2& backing, Action`1 notify) in C:\projects\Avalonia\src\Avalonia.Base\PriorityValue.cs:line 284
   at Avalonia.Utilities.DeferredSetter`2.SetAndNotify[TValue](TProperty property, TValue& backing, SetterDelegate`1 setterCallback, TSetRecord value) in C:\projects\Avalonia\src\Avalonia.Base\Utilities\DeferredSetter.cs:line 129
   at Avalonia.PriorityValue.UpdateValue(Object value, Int32 priority) in C:\projects\Avalonia\src\Avalonia.Base\PriorityValue.cs:line 250
   at Avalonia.Data.TemplateBinding.Subscribed() in C:\projects\Avalonia\src\Markup\Avalonia.Markup\Data\TemplateBinding.cs:line 112
   at Avalonia.Reactive.SingleSubscriberObservableBase`1.Subscribe(IObserver`1 observer) in C:\projects\Avalonia\src\Avalonia.Base\Reactive\SingleSubscriberObservableBase.cs:line 36
   at Avalonia.PriorityBindingEntry.Start(IObservable`1 binding) in C:\projects\Avalonia\src\Avalonia.Base\PriorityBindingEntry.cs:line 83
   at Avalonia.PriorityLevel.Add(IObservable`1 binding) in C:\projects\Avalonia\src\Avalonia.Base\PriorityLevel.cs:line 114
   at Avalonia.ValueStore.AddBinding(AvaloniaProperty property, IObservable`1 source, BindingPriority priority) in C:\projects\Avalonia\src\Avalonia.Base\ValueStore.cs:line 42
   at Avalonia.AvaloniaObjectExtensions.Bind(IAvaloniaObject target, AvaloniaProperty property, IBinding binding, Object anchor) in C:\projects\Avalonia\src\Avalonia.Base\AvaloniaObjectExtensions.cs:line 170
   at Avalonia.Markup.Data.DelayedBinding.BindingEntry.Apply(IStyledElement control) in C:\projects\Avalonia\src\Markup\Avalonia.Markup\Markup\Data\DelayedBinding.cs:line 132
   at Avalonia.Markup.Data.DelayedBinding.ApplyBindings(IStyledElement control) in C:\projects\Avalonia\src\Markup\Avalonia.Markup\Markup\Data\DelayedBinding.cs:line 97
   at Avalonia.Markup.Data.DelayedBinding.ApplyBindings(Object sender, EventArgs e) in C:\projects\Avalonia\src\Markup\Avalonia.Markup\Markup\Data\DelayedBinding.cs:line 110
   at Avalonia.Visual.SetVisualParent(Visual value) in C:\projects\Avalonia\src\Avalonia.Visuals\Visual.cs:line 531
   at Avalonia.Visual.VisualChildrenChanged(Object sender, NotifyCollectionChangedEventArgs e) in C:\projects\Avalonia\src\Avalonia.Visuals\Visual.cs:line 544
   at Avalonia.Collections.AvaloniaList`1.NotifyAdd(IList t, Int32 index) in C:\projects\Avalonia\src\Avalonia.Base\Collections\AvaloniaList.cs:line 506
   at Avalonia.Controls.Primitives.TemplatedControl.ApplyTemplate() in C:\projects\Avalonia\src\Avalonia.Controls\Primitives\TemplatedControl.cs:line 268
   at Avalonia.Layout.Layoutable.MeasureCore(Size availableSize) in C:\projects\Avalonia\src\Avalonia.Layout\Layoutable.cs:line 470
   at Avalonia.Layout.Layoutable.Measure(Size availableSize) in C:\projects\Avalonia\src\Avalonia.Layout\Layoutable.cs:line 318
   at Avalonia.Controls.Grid.MeasureOverride(Size constraint) in C:\projects\Avalonia\src\Avalonia.Controls\Grid.cs:line 214
   at Avalonia.Layout.Layoutable.MeasureCore(Size availableSize) in C:\projects\Avalonia\src\Avalonia.Layout\Layoutable.cs:line 475
   at Avalonia.Layout.Layoutable.Measure(Size availableSize) in C:\projects\Avalonia\src\Avalonia.Layout\Layoutable.cs:line 318
   at Avalonia.Layout.LayoutHelper.MeasureChild(ILayoutable control, Size availableSize, Thickness padding) in C:\projects\Avalonia\src\Avalonia.Layout\LayoutHelper.cs:line 44
   at Avalonia.Controls.Presenters.ContentPresenter.MeasureOverride(Size availableSize) in C:\projects\Avalonia\src\Avalonia.Controls\Presenters\ContentPresenter.cs:line 325
   at Avalonia.Layout.Layoutable.MeasureCore(Size availableSize) in C:\projects\Avalonia\src\Avalonia.Layout\Layoutable.cs:line 475
   at Avalonia.Layout.Layoutable.Measure(Size availableSize) in C:\projects\Avalonia\src\Avalonia.Layout\Layoutable.cs:line 318
   at Avalonia.Layout.Layoutable.MeasureOverride(Size availableSize) in C:\projects\Avalonia\src\Avalonia.Layout\Layoutable.cs:line 524
   at Avalonia.Layout.Layoutable.MeasureCore(Size availableSize) in C:\projects\Avalonia\src\Avalonia.Layout\Layoutable.cs:line 475
   at Avalonia.Layout.Layoutable.Measure(Size availableSize) in C:\projects\Avalonia\src\Avalonia.Layout\Layoutable.cs:line 318
   at Avalonia.Layout.LayoutManager.Measure(ILayoutable control) in C:\projects\Avalonia\src\Avalonia.Layout\LayoutManager.cs:line 173
   at Avalonia.Layout.LayoutManager.ExecuteMeasurePass() in C:\projects\Avalonia\src\Avalonia.Layout\LayoutManager.cs:line 124
   at Avalonia.Layout.LayoutManager.ExecuteLayoutPass() in C:\projects\Avalonia\src\Avalonia.Layout\LayoutManager.cs:line 89
   at Avalonia.Threading.JobRunner.RunJobs(Nullable`1 priority) in C:\projects\Avalonia\src\Avalonia.Base\Threading\JobRunner.cs:line 70
   at Avalonia.Win32.Win32Platform.WndProc(IntPtr hWnd, UInt32 msg, IntPtr wParam, IntPtr lParam)
   at Avalonia.Win32.Interop.UnmanagedMethods.DispatchMessage(MSG& lpmsg)
   at Avalonia.Win32.Win32Platform.RunLoop(CancellationToken cancellationToken)
   at Avalonia.Threading.Dispatcher.MainLoop(CancellationToken cancellationToken) in C:\projects\Avalonia\src\Avalonia.Base\Threading\Dispatcher.cs:line 65
   at Avalonia.Application.Run(Window mainWindow) in C:\projects\Avalonia\src\Avalonia.Controls\Application.cs:line 236
   at AvaloniaDemo.Program.Main(String[] args) in C:\DOWNLOADS\GitHub\Dock\samples\AvaloniaDemo\Program.cs:line 46
danwalmsley commented 6 years ago

https://github.com/AvaloniaUI/Avalonia/issues/1764