diff --git a/src/Avalonia.ReactiveUI/AutoDataTemplateBindingHook.cs b/src/Avalonia.ReactiveUI/AutoDataTemplateBindingHook.cs index 4881c77034..fe4e9dd94a 100644 --- a/src/Avalonia.ReactiveUI/AutoDataTemplateBindingHook.cs +++ b/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; } diff --git a/tests/Avalonia.ReactiveUI.UnitTests/AutoDataTemplateBindingHookTest.cs b/tests/Avalonia.ReactiveUI.UnitTests/AutoDataTemplateBindingHookTest.cs index 2fdd12a391..0a04d802e2 100644 --- a/tests/Avalonia.ReactiveUI.UnitTests/AutoDataTemplateBindingHookTest.cs +++ b/tests/Avalonia.ReactiveUI.UnitTests/AutoDataTemplateBindingHookTest.cs @@ -33,31 +33,13 @@ namespace Avalonia.ReactiveUI.UnitTests Template = GetTemplate() }; - public ExampleView() + public ExampleView(Action 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 - { - 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>(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(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((parent, scope) => + return new FuncControlTemplate((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) }); } }