Ваш подход неверен. Во-первых, вы не должны доверять порядку, в котором происходит виртуализация сетки данных. Следовательно, подход, основанный на счетчике, для загрузки разных списков происходит хаотично.
Когда строка сетки данных де-виртуализируется, ваш комбинированный список становится видимым, запрашивает источник элементов и получает его из свойства Window.AllPlayers
. Но порядок counter
будет ввернут на основе прокрутки. Если вы неожиданно пропустите прокрутку, пропустив несколько строк, или если вы используете отложенную прокрутку, counter
всегда будет неправильным. Если вы прокрутите вперед и назад, counter
будет ввернут (поскольку я не вижу никакого кода для уменьшения счетчика) ...
Итак, суть в том, пожалуйста, не используйте этот подход.
Теперь вы сказали, что не хотите загружать список из отдельного элемента. Переменная counter
, вероятно, относится к Index
текущей строки в сетке данных ItemsSource
. Если это так, то вы можете хотя бы использовать мульти-конвертер для того же.
Combobox XAML:
<ComboBox
SelectedValue="0"
DisplayMemberPath="FullName"
SelectedValuePath="Id" >
<ComboBox.ItemsSource>
<MultiBinding Converter="{StaticResource RowWiseListConverter}">
<!--The current row item-->
<Binding BindsDirectlyToSource="True" />
<!---The items source of the data grid.-->
<Binding Path="ItemsSource"
RelativeSource="{RelativeSource
AncestorType={x:Type DataGrid}}"/>
</MultiBinding>
</ComboBox.ItemsSource>
</ComboBox>
Код мультиконвертера:
public class RowWiseListConverter : IMultiValueConverter
{
public object Convert(
object[] values,
Type targetType,
object parameter,
CultureInfo culture)
{
var item = values[0];
var list = values[1] as System.Collections.IEnumerable;
if (item != null && list != null)
{
var counter = list.Cast<object>().ToList().IndexOf(item);
List<Player> lst = new List<Player>();
for (int i = 0; i < 5; i++)
{
Player p = new Player();
p.Id = counter + i;
p.FullName = "Name " + counter + i;
lst.Add(p);
}
return lst;
}
return null;
}
.....
}
Код только для иллюстрации и может не компилироваться.
Надеюсь, это поможет.