Browse Source

Don't apply hook when DataTemplates property is set

pull/4473/head
artyom 6 years ago
parent
commit
fbc549b51c
  1. 4
      src/Avalonia.ReactiveUI/AutoDataTemplateBindingHook.cs
  2. 57
      tests/Avalonia.ReactiveUI.UnitTests/AutoDataTemplateBindingHookTest.cs

4
src/Avalonia.ReactiveUI/AutoDataTemplateBindingHook.cs

@ -48,6 +48,10 @@ namespace Avalonia.ReactiveUI
if (itemsControl.ItemTemplate != null)
return true;
if (itemsControl.DataTemplates != null &&
itemsControl.DataTemplates.Count > 0)
return true;
itemsControl.ItemTemplate = DefaultItemTemplate;
return true;
}

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

@ -33,31 +33,13 @@ namespace Avalonia.ReactiveUI.UnitTests
Template = GetTemplate()
};
public ExampleView()
public ExampleView(Action<ItemsControl> adjustItemsControl = null)
{
adjustItemsControl?.Invoke(List);
List.ApplyTemplate();
List.Presenter.ApplyTemplate();
Content = List;
ViewModel = new ExampleViewModel();
this.OneWayBind(ViewModel, x => x.Items, x => x.List.Items);
}
}
public class ExampleViewWithItemTemplate : ReactiveUserControl<ExampleViewModel>
{
public ItemsControl List { get; } = new ItemsControl
{
Template = GetTemplate()
};
public ExampleViewWithItemTemplate()
{
List.ApplyTemplate();
List.Presenter.ApplyTemplate();
List.ItemTemplate = GetItemTemplate();
Content = List;
ViewModel = new ExampleViewModel();
this.OneWayBind(ViewModel, x => x.Items, x => x.List.Items);
}
@ -81,7 +63,7 @@ namespace Avalonia.ReactiveUI.UnitTests
[Fact]
public void Should_Not_Override_Data_Template_Binding_When_Item_Template_Is_Set()
{
var view = new ExampleViewWithItemTemplate();
var view = new ExampleView(control => control.ItemTemplate = GetItemTemplate());
Assert.NotNull(view.List.ItemTemplate);
Assert.IsType<FuncDataTemplate<TextBlock>>(view.List.ItemTemplate);
}
@ -102,7 +84,20 @@ namespace Avalonia.ReactiveUI.UnitTests
[Fact]
public void Should_Not_Use_View_Model_View_Host_When_Item_Template_Is_Set()
{
var view = new ExampleViewWithItemTemplate();
var view = new ExampleView(control => control.ItemTemplate = GetItemTemplate());
view.ViewModel.Items.Add(new NestedViewModel());
var child = view.List.Presenter.Panel.Children[0];
var container = (ContentPresenter) child;
container.UpdateChild();
Assert.IsType<TextBlock>(container.Child);
}
[Fact]
public void Should_Not_Use_View_Model_View_Host_When_Data_Templates_Are_Not_Empty()
{
var view = new ExampleView(control => control.DataTemplates.Add(GetItemTemplate()));
view.ViewModel.Items.Add(new NestedViewModel());
var child = view.List.Presenter.Panel.Children[0];
@ -116,7 +111,6 @@ namespace Avalonia.ReactiveUI.UnitTests
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());
var child = view.List.Presenter.Panel.Children[0];
@ -139,17 +133,14 @@ namespace Avalonia.ReactiveUI.UnitTests
private static FuncControlTemplate GetTemplate()
{
return new FuncControlTemplate<ItemsControl>((parent, scope) =>
return new FuncControlTemplate<ItemsControl>((parent, scope) => new Border
{
return new Border
Background = new Media.SolidColorBrush(0xffffffff),
Child = new ItemsPresenter
{
Background = new Media.SolidColorBrush(0xffffffff),
Child = new ItemsPresenter
{
Name = "PART_ItemsPresenter",
[~ItemsPresenter.ItemsProperty] = parent[~ItemsControl.ItemsProperty],
}.RegisterInNameScope(scope)
};
Name = "PART_ItemsPresenter",
[~ItemsPresenter.ItemsProperty] = parent[~ItemsControl.ItemsProperty],
}.RegisterInNameScope(scope)
});
}
}

Loading…
Cancel
Save