У меня возникла очень сложная проблема со связыванием. Приложенное приложение чрезвычайно просто, как вы можете видеть, и это уменьшенное воспроизведение исходного кода, в котором появляется ошибка.
Чтобы воспроизвести проблему, запустите приложение и нажмите 3 кнопки с помощью значка +, начиная слева направо. Эти кнопки добавят 3 элемента в коллекцию. Затем нажмите 4-ю кнопку, чтобы перейти на вторую страницу. На второй странице выберите элемент TEA из выпадающего списка. Вернитесь на главную страницу и нажмите последнюю кнопку справа, которая добавит CAPPUCCINO. Вы получите исключение Value does not fall within expected range
. Я хотел бы знать, почему это происходит, а не только обходное решение, которое не может быть реальным решением проблемы. Как видите, проблема возникает при очень специфических обстоятельствах.
Примечания:Связывание ComboBox с группированной коллекцией
- устраняющие статической переменной и прохождения экземпляра коллекции в
Navigate
вызове на вторую страницу не решить эту проблему - вместо
Add
вызова была вставка в порядке, который называетсяInsert
на Коллекция. Я удалил его иInsert
не проблема, ни решение - удаления
CollectionViewSource
на второй странице не решает проблему создавая еще одну коллекции зеркальнойGroupByLetter2
для выпадающего списка не исправляет проблему (см test1 филиал)
UPDATE: в конце концов, я был в состоянии установить CollectionViewSource.Source = null
на UserControl.Unloaded
события и зафиксировал его. Но вопрос по-прежнему остается открытым в рабочей теории.
https://github.com/albertorivelli/app1
Это главная страница:
<Page.Resources>
<CollectionViewSource x:Name="cvsProductsLetter" IsSourceGrouped="true" />
</Page.Resources>
<ListView x:Name="gwProducts" ItemsSource="{Binding Source={StaticResource cvsProductsLetter}}">
<ListView.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}" FontSize="20" />
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
CollectionViewSource
он заполняется в фоновом коде:
public sealed partial class MainPage : Page
{
public static ProductCollection _productcollection;
public MainPage()
{
this.InitializeComponent();
NavigationCacheMode = NavigationCacheMode.Enabled;
_productcollection = new App1.ProductCollection();
cvsProductsLetter.Source = _productcollection.GroupByLetter;
}
Это ProductCollection
класса:
public class ProductCollection
{
public ObservableCollection<ProductGroup> _groupsletter;
public ObservableCollection<ProductGroup> GroupByLetter
{
get
{
if (_groupsletter == null)
{
_groupsletter = new ObservableCollection<ProductGroup>();
}
return _groupsletter;
}
}
public void Add(Product newitem)
{
AddToLetterGroup(newitem);
}
private void AddToLetterGroup(Product item)
{
int i;
ProductGroup prodgr = null;
// get group from letter
for(i = 0; i < _groupsletter.Count; i++)
{
if (String.Equals(_groupsletter[i].Key, item.Name[0].ToString(), StringComparison.CurrentCultureIgnoreCase))
{
prodgr = _groupsletter[i];
break;
}
}
//new letter
if (prodgr == null)
{
prodgr = new ProductGroup();
prodgr.Key = item.Name[0].ToString();
prodgr.Add(item);
_groupsletter.Add(prodgr);
}
else
{
prodgr.Add(item);
}
}
}
public class ProductGroup : ObservableCollection<Product>
{
public string Key { get; set; }
}
..И Product
класс
public class Product : INotifyPropertyChanged
{
private string _name = "";
public event PropertyChangedEventHandler PropertyChanged;
public string Name
{
get { return _name; }
set
{
if (!String.Equals(_name, value))
{
_name = value;
OnPropertyChanged("Name");
}
}
}
protected void OnPropertyChanged(string name)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
public override string ToString()
{
return Name;
}
}
Это вторая страница с списком:
<Page.Resources>
<CollectionViewSource x:Name="cvsProductsLetter" IsSourceGrouped="true" />
</Page.Resources>
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<ComboBox ItemsSource="{Binding Source={StaticResource cvsProductsLetter}}" FontSize="20" Foreground="Black" />
</Grid>
public sealed partial class SecondPage : Page
{
public SecondPage()
{
this.InitializeComponent();
cvsProductsLetter.Source = App1.MainPage._productcollection.GroupByLetter;
}
Прошу прощения, но, пожалуйста, напишите свой код здесь. Мы (я) не желаем загружать и извлекать zip-файл и проходить через ваше приложение, чтобы помочь решить вашу проблему. Ограничьте его и разместите соответствующие строки. –
переехал на github ... –