diff --git a/src/Avalonia.ReactiveUI/AutoDataTemplateBindingHook.cs b/src/Avalonia.ReactiveUI/AutoDataTemplateBindingHook.cs
new file mode 100644
index 0000000000..bd156a5884
--- /dev/null
+++ b/src/Avalonia.ReactiveUI/AutoDataTemplateBindingHook.cs
@@ -0,0 +1,60 @@
+using System;
+using System.Linq;
+using Avalonia.Controls;
+using Avalonia.Markup.Xaml;
+using Avalonia.Markup.Xaml.Templates;
+using ReactiveUI;
+
+namespace Avalonia.ReactiveUI
+{
+ ///
+ /// AutoDataTemplateBindingHook is a binding hook that checks ItemsControls
+ /// that don't have DataTemplates, and assigns a default DataTemplate that
+ /// loads the View associated with each ViewModel.
+ ///
+ public class AutoDataTemplateBindingHook : IPropertyBindingHook
+ {
+ private static Lazy DefaultItemTemplate { get; } = new Lazy(() =>
+ {
+ var template = @"
+
+
+";
+
+ var loader = new AvaloniaXamlLoader();
+ return (DataTemplate)loader.Load(template);
+ });
+
+ ///
+ public bool ExecuteHook(
+ object source, object target,
+ Func[]> getCurrentViewModelProperties,
+ Func[]> getCurrentViewProperties,
+ BindingDirection direction)
+ {
+ var viewProperties = getCurrentViewProperties();
+ var lastViewProperty = viewProperties.LastOrDefault();
+ if (lastViewProperty == null)
+ return true;
+
+ var itemsControl = lastViewProperty.Sender as ItemsControl;
+ if (itemsControl == null)
+ return true;
+
+ var propertyName = viewProperties.Last().GetPropertyName();
+ if (propertyName != "Items" &&
+ propertyName != "ItemsSource")
+ return true;
+
+ if (itemsControl.ItemTemplate != null)
+ return true;
+
+ itemsControl.ItemTemplate = DefaultItemTemplate.Value;
+ return true;
+ }
+ }
+}
\ No newline at end of file
diff --git a/tests/Avalonia.ReactiveUI.UnitTests/AutoDataTemplateBindingHookTest.cs b/tests/Avalonia.ReactiveUI.UnitTests/AutoDataTemplateBindingHookTest.cs
new file mode 100644
index 0000000000..2391daece2
--- /dev/null
+++ b/tests/Avalonia.ReactiveUI.UnitTests/AutoDataTemplateBindingHookTest.cs
@@ -0,0 +1,56 @@
+// Copyright (c) The Avalonia Project. All rights reserved.
+// Licensed under the MIT license. See licence.md file in the project root for full license information.
+
+using Xunit;
+using ReactiveUI;
+using Avalonia.ReactiveUI;
+using Avalonia.UnitTests;
+using Avalonia.Controls;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Linq;
+using Splat;
+
+namespace Avalonia.ReactiveUI.UnitTests
+{
+ public class AutoDataTemplateBindingHookTest
+ {
+ public class NestedViewModel : ReactiveObject { }
+
+ public class NestedView : ReactiveUserControl { }
+
+ public class ExampleViewModel : ReactiveObject
+ {
+ public ObservableCollection Items { get; } = new ObservableCollection();
+ }
+
+ public class ExampleView : ReactiveUserControl
+ {
+ public ListBox List { get; } = new ListBox();
+
+ public ExampleView()
+ {
+ Content = List;
+ ViewModel = new ExampleViewModel();
+ this.OneWayBind(ViewModel, x => x.Items, x => x.List.Items);
+ }
+ }
+
+ public AutoDataTemplateBindingHookTest()
+ {
+ Locator.CurrentMutable.RegisterConstant(new AutoDataTemplateBindingHook(), typeof(IPropertyBindingHook));
+ Locator.CurrentMutable.Register(() => new ExampleView(), typeof(IViewFor));
+ }
+
+ [Fact]
+ public void Should_Apply_Data_Template_Binding_When_No_Template_Is_Set()
+ {
+ var view = new ExampleView();
+ var root = new TestRoot
+ {
+ Child = view
+ };
+ Assert.NotNull(view.List.ItemTemplate);
+ }
+ }
+}
\ No newline at end of file