Browse Source

Added SelectedItemsControl.SelectedIndex

pull/58/head
Steven Kirk 12 years ago
parent
commit
41e434e13b
  1. 78
      Perspex.Controls/Primitives/SelectingItemsControl.cs
  2. 2
      Tests/Perspex.Controls.UnitTests/Perspex.Controls.UnitTests.csproj
  3. 154
      Tests/Perspex.Controls.UnitTests/Primitives/SelectingItemsControlTests.cs
  4. 34
      Tests/Perspex.Controls.UnitTests/SelectingItemsControlTests.cs

78
Perspex.Controls/Primitives/SelectingItemsControl.cs

@ -11,9 +11,13 @@ namespace Perspex.Controls.Primitives
using System.Linq;
using Perspex.Input;
using Perspex.VisualTree;
using System.Collections.Generic;
public abstract class SelectingItemsControl : ItemsControl
{
public static readonly PerspexProperty<int> SelectedIndexProperty =
PerspexProperty.Register<SelectingItemsControl, int>("SelectedIndex", coerce: CoerceSelectedIndex);
public static readonly PerspexProperty<object> SelectedItemProperty =
PerspexProperty.Register<SelectingItemsControl, object>("SelectedItem");
@ -21,6 +25,16 @@ namespace Perspex.Controls.Primitives
{
FocusableProperty.OverrideDefaultValue(typeof(SelectingItemsControl), true);
SelectedIndexProperty.Changed.Subscribe(x =>
{
var control = x.Sender as SelectingItemsControl;
if (control != null)
{
control.SelectedItem = control.GetItemAt((int)x.NewValue);
}
});
SelectedItemProperty.Changed.Subscribe(x =>
{
var control = x.Sender as SelectingItemsControl;
@ -32,6 +46,12 @@ namespace Perspex.Controls.Primitives
});
}
public int SelectedIndex
{
get { return this.GetValue(SelectedIndexProperty); }
set { this.SetValue(SelectedIndexProperty, value); }
}
public object SelectedItem
{
get { return this.GetValue(SelectedItemProperty); }
@ -40,7 +60,13 @@ namespace Perspex.Controls.Primitives
protected static int GetIndexOfItem(IEnumerable items, object item)
{
if (items != null)
var list = items as IList;
if (list != null)
{
return list.IndexOf(item);
}
else if (items != null)
{
int index = 0;
@ -58,11 +84,32 @@ namespace Perspex.Controls.Primitives
return -1;
}
protected static object GetItemAt(IEnumerable items, int index)
{
var list = items as IList;
if (list != null)
{
return list[index];
}
else if (items != null)
{
return items.Cast<object>().ElementAt(index);
}
return -1;
}
protected int GetIndexOfItem(object item)
{
return GetIndexOfItem(this.Items, item);
}
protected object GetItemAt(int index)
{
return GetItemAt(this.Items, index);
}
protected virtual void MoveSelection(FocusNavigationDirection direction)
{
var panel = this.Presenter?.Panel as INavigablePanel;
@ -150,6 +197,26 @@ namespace Perspex.Controls.Primitives
e.Handled = true;
}
private static int CoerceSelectedIndex(PerspexObject o, int value)
{
var control = o as SelectingItemsControl;
if (control != null)
{
if (value < -1)
{
return -1;
}
else if (value > -1)
{
var count = control.Items.Cast<object>().Count();
return Math.Min(value, count - 1);
}
}
return value;
}
private void SelectedItemChanged(object selected)
{
var containers = this.ItemContainerGenerator.GetAll()
@ -168,6 +235,15 @@ namespace Perspex.Controls.Primitives
{
item.IsSelected = item == selectedContainer;
}
if (selected == null)
{
this.SelectedIndex = -1;
}
else
{
this.SelectedIndex = GetIndexOfItem(selected);
}
}
}
}

2
Tests/Perspex.Controls.UnitTests/Perspex.Controls.UnitTests.csproj

@ -92,7 +92,7 @@
<Compile Include="DropDownTests.cs" />
<Compile Include="ScrollContentPresenterTests.cs" />
<Compile Include="ScrollViewerTests.cs" />
<Compile Include="SelectingItemsControlTests.cs" />
<Compile Include="Primitives\SelectingItemsControlTests.cs" />
<Compile Include="ListBoxTests.cs" />
<Compile Include="ItemsControlTests.cs" />
<Compile Include="ContentControlTests.cs" />

154
Tests/Perspex.Controls.UnitTests/Primitives/SelectingItemsControlTests.cs

@ -0,0 +1,154 @@
// -----------------------------------------------------------------------
// <copyright file="SelectingItemsControlTests.cs" company="Steven Kirk">
// Copyright 2014 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Controls.Primitives.UnitTests
{
using Perspex.Controls.Presenters;
using Perspex.Controls.Primitives;
using Perspex.Input;
using Xunit;
public class SelectingItemsControlTests
{
[Fact]
public void Item_IsSelected_Should_Initially_Be_False()
{
var items = new[]
{
new Item(),
new Item(),
};
var target = new Target
{
Items = items,
};
Assert.False(items[0].IsSelected);
Assert.False(items[1].IsSelected);
}
[Fact]
public void Setting_SelectedItem_Should_Set_Item_IsSelected_True()
{
var items = new[]
{
new Item(),
new Item(),
};
var target = new Target
{
Items = items,
};
target.Template = this.Template();
target.ApplyTemplate();
target.SelectedItem = items[1];
Assert.False(items[0].IsSelected);
Assert.True(items[1].IsSelected);
}
[Fact]
public void Setting_SelectedItem_Should_Set_SelectedIndex()
{
var items = new[]
{
new Item(),
new Item(),
};
var target = new Target
{
Items = items,
};
target.Template = this.Template();
target.ApplyTemplate();
target.SelectedItem = items[1];
Assert.Equal(1, target.SelectedIndex);
}
[Fact]
public void Setting_SelectedIndex_Should_Set_SelectedItem()
{
var items = new[]
{
new Item(),
new Item(),
};
var target = new Target
{
Items = items,
};
target.Template = this.Template();
target.ApplyTemplate();
target.SelectedIndex = 1;
Assert.Equal(items[1], target.SelectedItem);
}
[Fact]
public void Setting_SelectedIndex_Should_Coerce()
{
var items = new[]
{
new Item(),
new Item(),
};
var target = new Target
{
Items = items,
};
target.Template = this.Template();
target.ApplyTemplate();
target.SelectedIndex = 2;
Assert.Equal(1, target.SelectedIndex);
}
[Fact]
public void PointerPressed_Event_Should_Be_Handled()
{
var target = new Target();
var e = new PointerPressEventArgs
{
RoutedEvent = InputElement.PointerPressedEvent
};
target.RaiseEvent(e);
Assert.True(e.Handled);
}
private ControlTemplate Template()
{
return ControlTemplate.Create<Target>(control =>
new ItemsPresenter
{
Id = "itemsPresenter",
[~ItemsPresenter.ItemsProperty] = control[~ListBox.ItemsProperty],
[~ItemsPresenter.ItemsPanelProperty] = control[~ListBox.ItemsPanelProperty],
});
}
private class Target : SelectingItemsControl
{
}
private class Item : Control, ISelectable
{
public bool IsSelected { get; set; }
}
}
}

34
Tests/Perspex.Controls.UnitTests/SelectingItemsControlTests.cs

@ -1,34 +0,0 @@
// -----------------------------------------------------------------------
// <copyright file="SelectingItemsControlTests.cs" company="Steven Kirk">
// Copyright 2014 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Controls.UnitTests
{
using Perspex.Controls.Primitives;
using Perspex.Input;
using Xunit;
public class SelectingItemsControlTests
{
[Fact]
public void PointerPressed_Event_Should_Be_Handled()
{
var target = new Target();
var e = new PointerPressEventArgs
{
RoutedEvent = InputElement.PointerPressedEvent
};
target.RaiseEvent(e);
Assert.True(e.Handled);
}
private class Target : SelectingItemsControl
{
}
}
}
Loading…
Cancel
Save