Получение идентификатора / объекта для выбранного флажка в сетке данных. МОФ - PullRequest
0 голосов
/ 20 марта 2020

Я создаю DataGrid

<DataGrid x:Name="WordsDataGrid" Grid.Row="0" Grid.Column="0" Grid.RowSpan="3" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" 
              AutoGenerateColumns="False" CanUserAddRows="False">
        <DataGrid.Columns>
            <DataGridCheckBoxColumn Header="X" Width="10" Binding="{Binding Status}">
                <DataGridCheckBoxColumn.CellStyle>
                    <Style>
                        <EventSetter Event="CheckBox.Checked" Handler="OnChecked"/>
                    </Style>
                </DataGridCheckBoxColumn.CellStyle>
            </DataGridCheckBoxColumn>
        </DataGrid.Columns>
    </DataGrid>

И в C# добавляем столбцы и ItemSource

private void AddItemToWordsGrid()
    {
        var a = typeof(Words).GetProperties();
        WordsDataGrid.Columns.Add(new DataGridTextColumn() { Header = "Mnemonik", Binding = new Binding("Mnemoniese"), Width = new DataGridLength(1, DataGridLengthUnitType.Star) });
        foreach (var item in a)
        {
            if (item.Name.ToLower().Contains("word"))
            {
                WordsDataGrid.Columns.Add(new DataGridTextColumn() { Header = item.Name.Substring(4, item.Name.Length-4),Binding= new Binding(item.Name), Width = new DataGridLength(1, DataGridLengthUnitType.Star) });
            }
        }
        var list = new List<WordWithStatus>();
        foreach (var item in repository.ReturnWords())
        {
            list.Add(new WordWithStatus(){ Id=item.Id, Mnemoniese = item.Mnemoniese, wordPl = item.wordPl, wordEng = item.wordEng, wordRus = item.wordRus});
        }
        WordsDataGrid.ItemsSource = list;
    }

И у меня есть событие:

private void OnChecked(object sender, RoutedEventArgs e)
    {
        if (SelectedWords == null)
            SelectedWords = new List<Words>();
        foreach (var item in WordsDataGrid.Items)
        {
            var s = item as WordWithStatus;
            if (s == null)
                return;
            if (s.Status)
                if (SelectedWords.FirstOrDefault(x => x.Mnemoniese == s.Mnemoniese) == null)
                    SelectedWords.Add(new Words() {Id=s.Id, Mnemoniese = s.Mnemoniese, wordPl = s.wordPl, wordEng = s.wordEng, wordRus = s.wordRus, });
        }
        ProjectDataGrid.ItemsSource = null;
        ProjectDataGrid.ItemsSource = SelectedWords;
    }

class WordWithStatus
{
    public bool Status { get; set; } = false;
    public int Id { get; set; }
    public string Mnemoniese { get; set; }
    public string wordPl { get; set; }
    public string wordEng { get; set; }
    public string wordRus { get; set; }
}

Текущий код не работает, как ожидалось. И дело в том, что, установив флажок в сетке данных, он хочет переписать этот объект во второй флажок. В этом решении недостаточно переписать объект, который почти идентичен, но с переменной bool. Я должен проверять весь список каждый раз. Кроме того, когда флажок установлен, он имеет значение true, когда следующий выбран в методе OnChecked (), поэтому он работает с «задержкой».

Мне кажется, что должно быть проще решение, позволяющее мне проверить индекс или загрузить объект с установленным флажком.

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