mirror of
https://github.com/AtomUI/AtomUI.git
synced 2026-10-28 23:08:36 +08:00
152 lines
4.1 KiB
C#
152 lines
4.1 KiB
C#
using System.ComponentModel;
|
|
using AtomUI.Controls;
|
|
using Avalonia.Controls;
|
|
using Avalonia.Data;
|
|
using Avalonia.Threading;
|
|
using Avalonia.VisualTree;
|
|
using Shouldly;
|
|
using Xunit;
|
|
using AtomRadioButton = AtomUI.Desktop.Controls.RadioButton;
|
|
using AvaloniaWindow = Avalonia.Controls.Window;
|
|
|
|
namespace AtomUI.Desktop.Controls.Tests.RadioButton;
|
|
|
|
public class RadioButtonGroupSelectionBindingTests
|
|
{
|
|
static RadioButtonGroupSelectionBindingTests()
|
|
{
|
|
AvaloniaTestApp.EnsureInitialized();
|
|
}
|
|
|
|
[Fact]
|
|
public void CheckedItem_Is_TwoWay_And_DataValidation_Enabled()
|
|
{
|
|
var metadata = Desktop.Controls.RadioButtonGroup.CheckedItemProperty.GetMetadata(
|
|
typeof(Desktop.Controls.RadioButtonGroup));
|
|
|
|
metadata.DefaultBindingMode.ShouldBe(BindingMode.TwoWay);
|
|
metadata.EnableDataValidation.ShouldBe(true);
|
|
}
|
|
|
|
[Fact]
|
|
public void CheckedItem_DefaultBindingMode_Updates_ViewModel()
|
|
{
|
|
var apple = CreateOption("Apple");
|
|
var pear = CreateOption("Pear");
|
|
var viewModel = new RadioButtonGroupBindingViewModel
|
|
{
|
|
CheckedItem = apple
|
|
};
|
|
var group = new Desktop.Controls.RadioButtonGroup
|
|
{
|
|
ItemsSource = new[] { apple, pear }
|
|
};
|
|
group.Bind(
|
|
Desktop.Controls.RadioButtonGroup.CheckedItemProperty,
|
|
new Binding(nameof(RadioButtonGroupBindingViewModel.CheckedItem))
|
|
{
|
|
Source = viewModel
|
|
});
|
|
|
|
ShowInWindow(group, () =>
|
|
{
|
|
group.CheckedItem.ShouldBeSameAs(apple);
|
|
|
|
group.CheckedItem = pear;
|
|
Dispatcher.UIThread.RunJobs();
|
|
|
|
viewModel.CheckedItem.ShouldBeSameAs(pear);
|
|
});
|
|
}
|
|
|
|
[Fact]
|
|
public void CheckedItem_User_Selection_Updates_ViewModel()
|
|
{
|
|
var apple = CreateOption("Apple");
|
|
var pear = CreateOption("Pear");
|
|
var viewModel = new RadioButtonGroupBindingViewModel
|
|
{
|
|
CheckedItem = apple
|
|
};
|
|
var group = new Desktop.Controls.RadioButtonGroup
|
|
{
|
|
ItemsSource = new[] { apple, pear }
|
|
};
|
|
group.Bind(
|
|
Desktop.Controls.RadioButtonGroup.CheckedItemProperty,
|
|
new Binding(nameof(RadioButtonGroupBindingViewModel.CheckedItem))
|
|
{
|
|
Source = viewModel
|
|
});
|
|
|
|
ShowInWindow(group, () =>
|
|
{
|
|
FindRadioButton(group, apple).IsChecked.ShouldBe(true);
|
|
|
|
FindRadioButton(group, pear).IsChecked = true;
|
|
Dispatcher.UIThread.RunJobs();
|
|
|
|
group.CheckedItem.ShouldBeSameAs(pear);
|
|
viewModel.CheckedItem.ShouldBeSameAs(pear);
|
|
});
|
|
}
|
|
|
|
private static RadioButtonOption CreateOption(string content)
|
|
{
|
|
return new RadioButtonOption
|
|
{
|
|
Content = content
|
|
};
|
|
}
|
|
|
|
private static AtomRadioButton FindRadioButton(Control root, RadioButtonOption option)
|
|
{
|
|
return root.GetVisualDescendants()
|
|
.OfType<AtomRadioButton>()
|
|
.Single(radioButton => ReferenceEquals(radioButton.Content, option));
|
|
}
|
|
|
|
private static void ShowInWindow(Control content, Action assertion)
|
|
{
|
|
var window = new AvaloniaWindow
|
|
{
|
|
Width = 360,
|
|
Height = 240,
|
|
Content = content
|
|
};
|
|
|
|
try
|
|
{
|
|
window.Show();
|
|
Dispatcher.UIThread.RunJobs();
|
|
assertion();
|
|
}
|
|
finally
|
|
{
|
|
window.Close();
|
|
}
|
|
}
|
|
|
|
private sealed class RadioButtonGroupBindingViewModel : INotifyPropertyChanged
|
|
{
|
|
private object? _checkedItem;
|
|
|
|
public object? CheckedItem
|
|
{
|
|
get => _checkedItem;
|
|
set
|
|
{
|
|
if (ReferenceEquals(_checkedItem, value))
|
|
{
|
|
return;
|
|
}
|
|
|
|
_checkedItem = value;
|
|
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(CheckedItem)));
|
|
}
|
|
}
|
|
|
|
public event PropertyChangedEventHandler? PropertyChanged;
|
|
}
|
|
}
|