diff --git a/Perspex.Controls/CheckBox.cs b/Perspex.Controls/CheckBox.cs
index eb16656037..f4231f3497 100644
--- a/Perspex.Controls/CheckBox.cs
+++ b/Perspex.Controls/CheckBox.cs
@@ -4,10 +4,10 @@
//
// -----------------------------------------------------------------------
-using Perspex.Controls.Primitives;
-
namespace Perspex.Controls
{
+ using Perspex.Controls.Primitives;
+
public class CheckBox : ToggleButton
{
}
diff --git a/Perspex.Controls/ISelectable.cs b/Perspex.Controls/ISelectable.cs
new file mode 100644
index 0000000000..dae37394fa
--- /dev/null
+++ b/Perspex.Controls/ISelectable.cs
@@ -0,0 +1,13 @@
+// -----------------------------------------------------------------------
+//
+// Copyright 2014 MIT Licence. See licence.md for more information.
+//
+// -----------------------------------------------------------------------
+
+namespace Perspex.Controls
+{
+ public interface ISelectable
+ {
+ bool IsSelected { get; set; }
+ }
+}
diff --git a/Perspex.Controls/ListBox.cs b/Perspex.Controls/ListBox.cs
new file mode 100644
index 0000000000..2a98e7bf56
--- /dev/null
+++ b/Perspex.Controls/ListBox.cs
@@ -0,0 +1,19 @@
+// -----------------------------------------------------------------------
+//
+// Copyright 2014 MIT Licence. See licence.md for more information.
+//
+// -----------------------------------------------------------------------
+
+namespace Perspex.Controls
+{
+ using Perspex.Controls.Generators;
+ using Perspex.Controls.Primitives;
+
+ public class ListBox : SelectingItemsControl
+ {
+ protected override ItemContainerGenerator CreateItemContainerGenerator()
+ {
+ return new TypedItemContainerGenerator(this);
+ }
+ }
+}
diff --git a/Perspex.Controls/ListBoxItem.cs b/Perspex.Controls/ListBoxItem.cs
new file mode 100644
index 0000000000..327cff7887
--- /dev/null
+++ b/Perspex.Controls/ListBoxItem.cs
@@ -0,0 +1,25 @@
+// -----------------------------------------------------------------------
+//
+// Copyright 2014 MIT Licence. See licence.md for more information.
+//
+// -----------------------------------------------------------------------
+
+namespace Perspex.Controls
+{
+ public class ListBoxItem : ContentControl, ISelectable
+ {
+ public static readonly PerspexProperty IsSelectedProperty =
+ PerspexProperty.Register("IsSelected");
+
+ static ListBoxItem()
+ {
+ PseudoClass(IsSelectedProperty, ":selected");
+ }
+
+ public bool IsSelected
+ {
+ get { return this.GetValue(IsSelectedProperty); }
+ set { this.SetValue(IsSelectedProperty, value); }
+ }
+ }
+}
diff --git a/Perspex.Controls/Perspex.Controls.csproj b/Perspex.Controls/Perspex.Controls.csproj
index 221f2731c3..7d903d4afb 100644
--- a/Perspex.Controls/Perspex.Controls.csproj
+++ b/Perspex.Controls/Perspex.Controls.csproj
@@ -41,6 +41,9 @@
+
+
+
diff --git a/Perspex.Controls/Primitives/SelectingItemsControl.cs b/Perspex.Controls/Primitives/SelectingItemsControl.cs
index e63278cea5..e53b993bcf 100644
--- a/Perspex.Controls/Primitives/SelectingItemsControl.cs
+++ b/Perspex.Controls/Primitives/SelectingItemsControl.cs
@@ -6,15 +6,68 @@
namespace Perspex.Controls.Primitives
{
+ using System;
+ using System.Linq;
+ using Perspex.Controls.Presenters;
+ using Perspex.Input;
+ using Perspex.Interactivity;
+
public class SelectingItemsControl : ItemsControl
{
public static readonly PerspexProperty