Флажок Silverlight внутри сетки данных, вызывающий проблему - PullRequest
2 голосов
/ 04 октября 2009

Привет всем, я столкнулся с проблемой с флажками внутри сетки данных.

Сначала позвольте мне опубликовать мой код того, чего я достиг, а затем я расскажу, в чем причина проблемы

Это код моей таблицы данных в дочернем окне

<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, но эта добавленная функция виртуализации сетки вызывает у меня проблемы в настоящее время, поэтому должно быть какое-то решение этой проблемы.

Спасибо

Ответы [ 2 ]

0 голосов
/ 11 сентября 2012

Я связывал свой комбобокс, но все еще получал проблему, пока я не начал использовать двухстороннее связывание, похоже, теперь нет

0 голосов
/ 06 октября 2009

Добавьте свойство IsSelected bool к вашей сущности и привяжите к нему элемент управления checkbox. Этот пример кода выглядит так, как будто вы используете службы .NET RIA и элемент управления DomainDataSource (ItemsSource = "{Binding Data, ElementName = dds}"), а не WCF? Я использовал это решение с WCF, но не в постраничной установке. Попробуйте и дайте нам знать, как это получается,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...