Browse Source

Remove LazyT, test new template resolver

pull/2560/head
artyom 7 years ago
parent
commit
8a2d1662fd
  1. 23
      src/Avalonia.ReactiveUI/AutoDataTemplateBindingHook.cs
  2. 28
      tests/Avalonia.ReactiveUI.UnitTests/AutoDataTemplateBindingHookTest.cs

23
src/Avalonia.ReactiveUI/AutoDataTemplateBindingHook.cs

@ -16,19 +16,16 @@ namespace Avalonia.ReactiveUI
/// </summary> /// </summary>
public class AutoDataTemplateBindingHook : IPropertyBindingHook public class AutoDataTemplateBindingHook : IPropertyBindingHook
{ {
private static Lazy<FuncDataTemplate> DefaultItemTemplate { get; } = new Lazy<FuncDataTemplate>(() => private static FuncDataTemplate DefaultItemTemplate = new FuncDataTemplate<object>(x =>
{ {
return new FuncDataTemplate<object>(x => var control = new ViewModelViewHost();
{ var context = control.GetObservable(Control.DataContextProperty);
var control = new ViewModelViewHost(); control.Bind(ViewModelViewHost.ViewModelProperty, context);
var context = control.GetObservable(Control.DataContextProperty); control.HorizontalContentAlignment = HorizontalAlignment.Stretch;
control.Bind(ViewModelViewHost.ViewModelProperty, context); control.VerticalContentAlignment = VerticalAlignment.Stretch;
control.HorizontalContentAlignment = HorizontalAlignment.Stretch; return control;
control.VerticalContentAlignment = VerticalAlignment.Stretch; },
return control; true);
},
true);
});
/// <inheritdoc/> /// <inheritdoc/>
public bool ExecuteHook( public bool ExecuteHook(
@ -51,7 +48,7 @@ namespace Avalonia.ReactiveUI
if (itemsControl.ItemTemplate != null) if (itemsControl.ItemTemplate != null)
return true; return true;
itemsControl.ItemTemplate = DefaultItemTemplate.Value; itemsControl.ItemTemplate = DefaultItemTemplate;
return true; return true;
} }
} }

28
tests/Avalonia.ReactiveUI.UnitTests/AutoDataTemplateBindingHookTest.cs

@ -13,6 +13,8 @@ using System.Linq;
using Avalonia.VisualTree; using Avalonia.VisualTree;
using Avalonia.Controls.Presenters; using Avalonia.Controls.Presenters;
using Splat; using Splat;
using System.Threading.Tasks;
using System;
namespace Avalonia.ReactiveUI.UnitTests namespace Avalonia.ReactiveUI.UnitTests
{ {
@ -42,8 +44,8 @@ namespace Avalonia.ReactiveUI.UnitTests
public AutoDataTemplateBindingHookTest() public AutoDataTemplateBindingHookTest()
{ {
Locator.CurrentMutable.RegisterConstant(new AutoDataTemplateBindingHook(), typeof(IPropertyBindingHook)); Locator.CurrentMutable.RegisterConstant(new AutoDataTemplateBindingHook(), typeof(IPropertyBindingHook));
Locator.CurrentMutable.Register(() => new ExampleView(), typeof(IViewFor<ExampleViewModel>));
Locator.CurrentMutable.RegisterConstant(new AvaloniaActivationForViewFetcher(), typeof(IActivationForViewFetcher)); Locator.CurrentMutable.RegisterConstant(new AvaloniaActivationForViewFetcher(), typeof(IActivationForViewFetcher));
Locator.CurrentMutable.Register(() => new NestedView(), typeof(IViewFor<NestedViewModel>));
} }
[Fact] [Fact]
@ -70,6 +72,30 @@ namespace Avalonia.ReactiveUI.UnitTests
Assert.IsType<ViewModelViewHost>(container.Child); Assert.IsType<ViewModelViewHost>(container.Child);
} }
[Fact]
public void Should_Resolve_And_Embedd_Appropriate_View_Model()
{
var view = new ExampleView();
var root = new TestRoot { Child = view };
view.ViewModel.Items.Add(new NestedViewModel());
view.List.Template = GetTemplate();
view.List.ApplyTemplate();
view.List.Presenter.ApplyTemplate();
var child = view.List.Presenter.Panel.Children[0];
var container = (ContentPresenter) child;
container.UpdateChild();
var host = (ViewModelViewHost) container.Child;
Assert.IsType<NestedViewModel>(host.ViewModel);
Assert.IsType<NestedViewModel>(host.DataContext);
host.DataContext = "changed context";
Assert.IsType<string>(host.ViewModel);
Assert.IsType<string>(host.DataContext);
}
private FuncControlTemplate GetTemplate() private FuncControlTemplate GetTemplate()
{ {
return new FuncControlTemplate<ItemsControl>(parent => return new FuncControlTemplate<ItemsControl>(parent =>

Loading…
Cancel
Save