Привет всем, я столкнулся с проблемой с флажками внутри сетки данных.
Сначала позвольте мне опубликовать мой код того, чего я достиг, а затем я расскажу, в чем причина проблемы
Это код моей таблицы данных в дочернем окне
<Controls:DataGrid x:Name="dgAthlete" Height="Auto" Width="Auto"
IsReadOnly="True" AutoGenerateColumns="False"
HorizontalAlignment="Stretch"
HorizontalScrollBarVisibility="Disabled"
ItemsSource="{Binding Data, ElementName=dds}"
>
<Controls:DataGrid.Columns>
<Controls:DataGridTemplateColumn Header="CheckBoxColumn">
<Controls:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox x:Name="cbAddAthlete" IsChecked="{Binding IsAdded}" Tag="{Binding}"
IsEnabled="True" Checked="cbAddAthlete_Checked" Unchecked="cbAddAthlete_Unchecked" />
</DataTemplate>
</Controls:DataGridTemplateColumn.CellTemplate>
<Controls:DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding Path=IsAdded,Mode=TwoWay}"/>
</DataTemplate>
</Controls:DataGridTemplateColumn.CellEditingTemplate>
</Controls:DataGridTemplateColumn>
<Controls:DataGridTemplateColumn>
<Controls:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Image Source="{Binding ImageFileName}"
Width="25" Height="25"
HorizontalAlignment="Stretch" />
</DataTemplate>
</Controls:DataGridTemplateColumn.CellTemplate>
</Controls:DataGridTemplateColumn>
<Controls:DataGridTextColumn Header="FirstName" Binding="{Binding FirstName}" />
<Controls:DataGridTextColumn Header="MiddleName" Binding="{Binding MiddleName}"/>
<Controls:DataGridTextColumn Header="LastName" Binding="{Binding LastName}"/>
<Controls:DataGridTextColumn Header="Email" Binding="{Binding Email}" />
<Controls:DataGridTextColumn Header="DOB" Binding="{Binding BirthDate}"/>
<Controls:DataGridTextColumn Header="Phone" Binding="{Binding PhoneNumber}"/>
<Controls:DataGridTextColumn Header="Website" Binding="{Binding WebSite}"/>
<Controls:DataGridTextColumn Header="Team" Binding="{Binding TeamName}"/>
<Controls:DataGridTextColumn Header="Club" Binding="{Binding ClubName}"/>
<Controls:DataGridTextColumn Header="County" Binding="{Binding CountyName}"/>
</Controls:DataGrid.Columns>
</Controls:DataGrid>
<Controls:DataPager x:Name="dpAthlete" PageSize="4"
HorizontalAlignment="Stretch" Source="{Binding Data, ElementName=dds}"
Width="Auto"/>
</StackPanel>
<Button x:Name="CancelButton" Content="Cancel" Click="CancelButton_Click" Width="75" Height="23" HorizontalAlignment="Right" Margin="0,12,0,0" Grid.Row="1" />
<Button x:Name="OKButton" Content="OK" Click="OKButton_Click" Width="75" Height="23" HorizontalAlignment="Right" Margin="0,12,79,0" Grid.Row="1" />
Код для этого
public partial class AddAthletesToCompetition : ChildWindow
{
public ObservableCollection<Athlete> Athletes { get; set; }
public int CompetitionId { get; set; }
private PagedCollectionView pvcAthlete;
public AddAthletesToCompetition(int competitionId)
{
InitializeComponent();
CompetitionId = competitionId;
LoadAthlete();
Athletes = new ObservableCollection<Athlete>();
}
private void OKButton_Click(object sender, RoutedEventArgs e)
{
this.DialogResult = true;
}
private void CancelButton_Click(object sender, RoutedEventArgs e)
{
this.DialogResult = false;
}
private void LoadAthlete()
{
var context = new PublicServiceClient();
context.GetAthletesNotInCompetitionCompleted += context_GetAthletesNotInCompetitionCompleted;
context.GetAthletesNotInCompetitionAsync(CompetitionId);
}
void context_GetAthletesNotInCompetitionCompleted(object sender, GetAthletesNotInCompetitionCompletedEventArgs e)
{
if (e.Result != null)
{
pvcAthlete = new PagedCollectionView(e.Result.ToList());
dgAthlete.ItemsSource = pvcAthlete;
dpAthlete.Source = pvcAthlete;
}
}
//Checkbox Checked Event Hanlder
private void cbAddAthlete_Checked(object sender, RoutedEventArgs e)
{
var athlete = ((CheckBox)sender).Tag as AthleteBO;
if (athlete != null)
{
var ath = new Athlete();
ath.AthleteId = athlete.AthleteId;
Athletes.Add(ath);
}
}
//CheckBox unchecked Event Handler
private void cbAddAthlete_Unchecked(object sender, RoutedEventArgs e)
{
var athlete = ((CheckBox)sender).Tag as AthleteBO;
if (athlete != null)
{
var item = Athletes.First(i => i.AthleteId == athlete.AthleteId);
Athletes.Remove(item);
}
}
}
Как вы можете видеть, я использую подкачку, все работает нормально, т.е. отмечаем и снимаем флажки, чтобы флажки работали нормально, когда мы находимся на первой странице, но, скажем, вы проверили первый и второй элемент таблицы на первой странице теперь, как только я перехожу на следующую страницу, моя сетка делает то, что сохраняет прежний вид и проверяет по умолчанию первый и второй элемент на второй странице, поведение которых не ожидается
Я просмотрел различные посты по этой проблеме и обнаружил, что проблема в том, что представление внедряется сеткой данных, но каким-то образом я не смог найти никакого решения.
То, о чем говорили другие, - это обновить наблюдаемую коллекцию и снова привязать ее к моей сетке.
Так что меня немного смутило, что и где связывать, и когда обновлять наблюдаемую коллекцию.
Я опубликовал весь код, и всякий раз, когда вы отвечаете, пожалуйста, указывайте, где именно я должен внести изменения, чтобы это работало.
Для заметки я использую WCF и EF, поэтому список спортсменов, который у меня есть, я буду отправлять этот список в службу WCF, где с помощью EF он будет вставлен в базу данных.
Я знаю, что это не ошибка в Silverlight, но эта добавленная функция виртуализации сетки вызывает у меня проблемы в настоящее время, поэтому должно быть какое-то решение этой проблемы.
Спасибо