123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using Avalonia.Controls.Presenters;
- using Avalonia.Controls.Primitives;
- using Avalonia.Controls.Templates;
- using Avalonia.Data;
- using Avalonia.Styling;
- using Avalonia.UnitTests;
- using Xunit;
- namespace Avalonia.Controls.UnitTests.Primitives
- {
- public class SelectingItemsControlTests_SelectedValue : ScopedTestBase
- {
- [Fact]
- public void Setting_SelectedItem_Sets_SelectedValue()
- {
- var items = TestClass.GetItems();
- var sic = new SelectingItemsControl
- {
- ItemsSource = items,
- SelectedValueBinding = new Binding("Name"),
- Template = Template()
- };
- sic.SelectedItem = items[1];
- Assert.Equal(items[1].Name, sic.SelectedValue);
- }
- [Fact]
- public void Setting_SelectedIndex_Sets_SelectedValue()
- {
- var items = TestClass.GetItems();
- var sic = new SelectingItemsControl
- {
- ItemsSource = items,
- SelectedValueBinding = new Binding("Name"),
- Template = Template()
- };
- sic.SelectedIndex = 1;
- Assert.Equal(items[1].Name, sic.SelectedValue);
- }
- [Fact]
- public void Setting_SelectedItems_Sets_SelectedValue()
- {
- var items = TestClass.GetItems();
- var sic = new ListBox
- {
- ItemsSource = items,
- SelectedValueBinding = new Binding("Name"),
- Template = Template()
- };
- sic.SelectedItems = new List<TestClass>
- {
- items[2],
- items[4],
- items[5]
- };
- // When interacting, SelectedItem is the first item in the SelectedItems collection
- // But when set here, it's the last
- Assert.Equal(items[5].Name, sic.SelectedValue);
- }
- [Fact]
- public void Setting_SelectedValue_Sets_SelectedIndex()
- {
- using (UnitTestApplication.Start(TestServices.StyledWindow))
- {
- var items = TestClass.GetItems();
- var sic = new SelectingItemsControl
- {
- ItemsSource = items,
- SelectedValueBinding = new Binding("Name"),
- Template = Template()
- };
- Prepare(sic);
- sic.SelectedValue = items[2].Name;
- Assert.Equal(2, sic.SelectedIndex);
- }
- }
- [Fact]
- public void Setting_SelectedValue_Sets_SelectedItem()
- {
- using (UnitTestApplication.Start(TestServices.StyledWindow))
- {
- var items = TestClass.GetItems();
- var sic = new SelectingItemsControl
- {
- ItemsSource = items,
- SelectedValueBinding = new Binding("Name"),
- Template = Template()
- };
- Prepare(sic);
- sic.SelectedValue = "Item2";
- Assert.Equal(items[2], sic.SelectedItem);
- }
- }
- [Fact]
- public void Changing_SelectedValueBinding_Updates_SelectedValue()
- {
- using (UnitTestApplication.Start(TestServices.StyledWindow))
- {
- var items = TestClass.GetItems();
- var sic = new SelectingItemsControl
- {
- ItemsSource = items,
- SelectedValueBinding = new Binding("Name"),
- Template = Template()
- };
- sic.SelectedValue = "Item2";
- sic.SelectedValueBinding = new Binding("AltProperty");
- // Ensure SelectedItem didn't change
- Assert.Equal(items[2], sic.SelectedItem);
- Assert.Equal("Alt2", sic.SelectedValue);
- }
- }
- [Fact]
- public void SelectedValue_With_Null_SelectedValueBinding_Is_Item()
- {
- var items = TestClass.GetItems();
- var sic = new SelectingItemsControl
- {
- ItemsSource = items,
- Template = Template()
- };
- sic.SelectedIndex = 1;
- Assert.Equal(items[1], sic.SelectedValue);
- }
- [Fact]
- public void Setting_SelectedValue_Before_Initialize_Should_Retain_Selection()
- {
- var items = TestClass.GetItems();
- var sic = new SelectingItemsControl
- {
- ItemsSource = items,
- Template = Template(),
- SelectedValueBinding = new Binding("Name"),
- SelectedValue = "Item2"
- };
- sic.BeginInit();
- sic.EndInit();
- Assert.Equal(items[2].Name, sic.SelectedValue);
- }
- [Fact]
- public void Setting_SelectedValue_To_Non_Existent_Item_Without_ItemsSource_Should_Keep_Selection_Until_ItemsSource_Is_Set()
- {
- var target = new SelectingItemsControl
- {
- Template = Template(),
- SelectedValueBinding = new Binding("Name")
- };
- target.ApplyTemplate();
- target.SelectedValue = "Item2";
- Assert.Equal(-1, target.SelectedIndex);
- Assert.Null(target.SelectedItem);
- Assert.Same("Item2", target.SelectedValue);
- target.ItemsSource = Array.Empty<TestClass>();
- Assert.Equal(-1, target.SelectedIndex);
- Assert.Null(target.SelectedItem);
- Assert.Null(target.SelectedValue);
- }
- [Fact]
- public void Setting_SelectedValue_Without_ItemsSource_Should_Keep_Selection_If_Item_Exists_When_ItemsSource_IsSet()
- {
- var target = new SelectingItemsControl
- {
- Template = Template(),
- SelectedValueBinding = new Binding("Name")
- };
- target.ApplyTemplate();
- target.SelectedValue = "Item2";
- Assert.Equal(-1, target.SelectedIndex);
- Assert.Null(target.SelectedItem);
- Assert.Same("Item2", target.SelectedValue);
- var items = TestClass.GetItems();
- target.ItemsSource = items;
- Assert.Equal(2, target.SelectedIndex);
- Assert.Same(items[2], target.SelectedItem);
- Assert.Equal("Item2", target.SelectedValue);
- }
- [Fact]
- public void Setting_SelectedValue_During_Initialize_Should_Take_Priority_Over_Previous_Value()
- {
- var items = TestClass.GetItems();
- var sic = new SelectingItemsControl
- {
- ItemsSource = items,
- Template = Template(),
- SelectedValueBinding = new Binding("Name"),
- SelectedValue = "Item2"
- };
- sic.BeginInit();
- sic.SelectedValue = "Item1";
- sic.EndInit();
- Assert.Equal(items[1].Name, sic.SelectedValue);
- }
- [Fact]
- public void Changing_Items_Should_Clear_SelectedValue()
- {
- using (UnitTestApplication.Start(TestServices.StyledWindow))
- {
- var items = TestClass.GetItems();
- var sic = new SelectingItemsControl
- {
- ItemsSource = items,
- Template = Template(),
- SelectedValueBinding = new Binding("Name"),
- SelectedValue = "Item2"
- };
- Prepare(sic);
- sic.ItemsSource = new List<TestClass>
- {
- new TestClass("NewItem", string.Empty)
- };
- Assert.Equal(null, sic.SelectedValue);
- }
- }
- [Fact]
- public void Setting_SelectedValue_Should_Raise_SelectionChanged_Event()
- {
- // Unlike SelectedIndex/SelectedItem tests, we need the ItemsControl to
- // initialize so that SelectedValue can actually be looked up
- using (UnitTestApplication.Start(TestServices.StyledWindow))
- {
- var items = TestClass.GetItems();
- var sic = new SelectingItemsControl
- {
- ItemsSource = items,
- Template = Template(),
- SelectedValueBinding = new Binding("Name"),
- };
- Prepare(sic);
- var called = false;
- sic.SelectionChanged += (s, e) =>
- {
- Assert.Same(items[2], e.AddedItems.Cast<object>().Single());
- Assert.Empty(e.RemovedItems);
- called = true;
- };
- sic.SelectedValue = "Item2";
- Assert.True(called);
- }
- }
- [Fact]
- public void Clearing_SelectedValue_Should_Raise_SelectionChanged_Event()
- {
- var items = TestClass.GetItems();
- var sic = new SelectingItemsControl
- {
- ItemsSource = items,
- Template = Template(),
- SelectedValueBinding = new Binding("Name"),
- SelectedValue = "Item2"
- };
- var called = false;
- sic.SelectionChanged += (s, e) =>
- {
- Assert.Same(items[2], e.RemovedItems.Cast<object>().Single());
- Assert.Empty(e.AddedItems);
- called = true;
- };
- sic.SelectedValue = null;
- Assert.True(called);
- }
- [Fact]
- public void Handles_Null_SelectedItem_When_SelectedValueBinding_Assigned()
- {
- // Issue #11220
- var items = new object[] { null };
- var sic = new SelectingItemsControl
- {
- ItemsSource = items,
- SelectedIndex = 1,
- SelectedValueBinding = new Binding("Name"),
- Template = Template()
- };
- Assert.Null(sic.SelectedValue);
- }
- private static FuncControlTemplate Template()
- {
- return new FuncControlTemplate<SelectingItemsControl>((control, scope) =>
- new ItemsPresenter
- {
- Name = "itemsPresenter",
- [~ItemsPresenter.ItemsPanelProperty] = control[~ItemsControl.ItemsPanelProperty],
- }.RegisterInNameScope(scope));
- }
- private static void Prepare(SelectingItemsControl target)
- {
- var root = new TestRoot
- {
- Child = target,
- Width = 100,
- Height = 100,
- Styles =
- {
- new Style(x => x.Is<SelectingItemsControl>())
- {
- Setters =
- {
- new Setter(ListBox.TemplateProperty, Template()),
- },
- },
- },
- };
- root.LayoutManager.ExecuteInitialLayoutPass();
- }
- }
- internal class TestClass
- {
- public TestClass(string name, string alt)
- {
- Name = name;
- AltProperty = alt;
- }
- public string Name { get; set; }
- public string AltProperty { get; set; }
- public static List<TestClass> GetItems()
- {
- return new List<TestClass>
- {
- new TestClass(null, null),
- new TestClass("Item1", "Alt1"),
- new TestClass("Item2", "Alt2"),
- new TestClass("Item3", "Alt3"),
- new TestClass("Item4", "Alt4"),
- new TestClass("Item5", "Alt5"),
- };
- }
- }
- }
|