maui-linux/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issu.../ListViewViewCellBinding.cs

172 строки
4.5 KiB
C#

using System;
using System.Collections.ObjectModel;
using System.Threading;
using Xamarin.Forms.CustomAttributes;
using Xamarin.Forms.Internals;
#if UITEST
using NUnit.Framework;
using Xamarin.UITest;
#endif
namespace Xamarin.Forms.Controls
{
public class GenericValueConverter : IValueConverter
{
Func<object, object> _convert;
Func<object, object> _back;
public GenericValueConverter(Func<object, object> convert, Func<object, object> back = null)
{
_convert = convert;
_back = back;
}
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return _convert(value);
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return _back(value);
}
}
}
namespace Xamarin.Forms.Controls.Issues
{
[Preserve (AllMembers = true)]
public class Expense
{
public string Name { get; private set; }
public decimal Amount { get; private set; }
public Expense (string name, decimal amount)
{
Name = name;
Amount = amount;
}
}
[Preserve (AllMembers = true)]
public class ExpenseListViewCell : ViewCell
{
public ExpenseListViewCell ()
{
var expenseNameLabel = new Label ();
expenseNameLabel.SetBinding (Label.TextProperty, "Name");
var expenseAmountLabel = new Label ();
var expenseAmountToStringConverter = new GenericValueConverter (obj => string.Format ("{0:C}", ((decimal)obj)));
expenseAmountLabel.SetBinding (Label.TextProperty, new Binding ("Amount", converter: expenseAmountToStringConverter));
var layout = new StackLayout ();
layout.Children.Add (expenseNameLabel);
layout.Children.Add (expenseAmountLabel);
View = layout;
}
protected override void OnBindingContextChanged ()
{
// Fixme : this is happening because the View.Parent is getting
// set after the Cell gets the binding context set on it. Then it is inheriting
// the parents binding context.
View.BindingContext = BindingContext;
base.OnBindingContextChanged ();
}
}
[Preserve (AllMembers = true)]
[Issue (IssueTracker.None, 0, "ListView ViewCell binding", PlatformAffected.All)]
public class ListViewViewCellBinding : TestContentPage
{
// Binding issue with view cells
public ObservableCollection<Expense> Expenses;
protected override void Init ()
{
//BindingContext = this;
Expenses = new ObservableCollection<Expense> {
new Expense ("1", 100.0m),
new Expense ("2", 200.0m),
new Expense ("3", 300.0m)
};
var listView = new ListView ();
listView.ItemsSource = Expenses;
listView.ItemTemplate = new DataTemplate (typeof (ExpenseListViewCell));
var layout = new StackLayout ();
int numberAdded = 3;
var label = new Label {
Text = numberAdded.ToString()
};
var removeBtn = new Button { Text = "Remove" };
removeBtn.Clicked += (s, e) => {
if (numberAdded > 0) {
numberAdded--;
Expenses.RemoveAt (0);
label.Text = numberAdded.ToString ();
}
};
var addBtn = new Button { Text = "Add" };
addBtn.Clicked += (s, e) => {
Expenses.Add (new Expense ("4", 400.0m));
numberAdded++;
label.Text = numberAdded.ToString ();
};
layout.Children.Add (label);
layout.Children.Add (removeBtn);
layout.Children.Add (addBtn);
layout.Children.Add (listView);
Content = layout;
}
#if UITEST
[Test]
public void ListViewViewCellBindingTestsAllElementsPresent ()
{
RunningApp.WaitForElement (q => q.Marked ("Remove"));
RunningApp.WaitForElement (q => q.Marked ("Add"));
RunningApp.WaitForElement (q => q.Marked ("1"));
RunningApp.WaitForElement (q => q.Marked ("$100.00"));
RunningApp.WaitForElement (q => q.Marked ("2"));
RunningApp.WaitForElement (q => q.Marked ("$200.00"));
RunningApp.WaitForElement (q => q.Marked ("3"));
RunningApp.WaitForElement (q => q.Marked ("$300.00"));
RunningApp.Screenshot ("All elements exist");
}
[Test]
public void ListViewViewCellBindingTestsAddListItem ()
{
RunningApp.Tap (q => q.Button ("Add"));
RunningApp.WaitForElement (q => q.Marked ("4"));
RunningApp.WaitForElement (q => q.Marked ("$400.00"));
RunningApp.Screenshot ("List item added");
}
[Test]
public void ListViewViewCellBindingTestsRemoveListItem ()
{
RunningApp.Tap (q => q.Button ("Remove"));
RunningApp.WaitForNoElement (q => q.Marked ("1"));
RunningApp.WaitForNoElement (q => q.Marked ("$100.00"));
RunningApp.Screenshot ("List item removed");
}
#endif
}
}