Pārlūkot izejas kodu

Don't apply hook when DataTemplates property is set

artyom 5 gadi atpakaļ
vecāks
revīzija
fbc549b51c

+ 4 - 0
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;
         }

+ 24 - 33
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)
             });
         }
     }