C # WPF Datagrid в Tab Control (динамически создается) не показывает данные - PullRequest
0 голосов
/ 18 января 2019

Я пытаюсь создать динамически созданный TabControl со встроенной сеткой данных для каждой созданной вкладки. Почему динамически создаются вкладки? Пользователь может открыть несколько файлов, а количество выбранных файлов равно количеству вкладок. Почему Датагрид внутри вкладок. Каждая вкладка содержит (в будущем) огромное количество рассчитанных данных, которые должны быть показаны в таблице данных.

Этот подход показывает таблицу данных в каждой вкладке, а также столбец «Имя», но под ним не отображаются данные.

XAML:

<TabControl x:Name="TabControlCells" Margin="10,291,635,0"  Height="229" VerticalAlignment="Top">
    <TabControl.ContentTemplate>
        <DataTemplate>
            <StackPanel>
                <DataGrid x:Name="DataGridCells" CanUserAddRows="False" CanUserDeleteRows="False" AutoGenerateColumns="False" ItemsSource="{Binding Files}" >
                    <DataGrid.Columns>
                        <DataGridTextColumn Header="Name" Binding="{Binding Name}" IsReadOnly="True" />

                    </DataGrid.Columns>
                </DataGrid>

            </StackPanel>
        </DataTemplate>
    </TabControl.ContentTemplate>
</TabControl>

C #:

private void Calculate(object sender, RoutedEventArgs e) 
{
    void ThreadCompletion() {
        this.Dispatcher.Invoke(() => {
            TabControlCells.Visibility = Visibility.Visible;
            foreach (File file in Globals.Files) {
                TabItem item = new TabItem {
                    Header = file.FileName.Split('.')[0]
                };
                item.Content = file.Cells;
                TabControlCells.Items.Add(item);
            }
            TabControlCells.SelectedIndex = 0;
        });
    }

    Thread Calculations = new Thread(() => 
    {
        try 
        {
            Mean.CalculateBaselineMean();
        }
        finally 
        {
            ThreadCompletion();
        }
    });
    Calculations.Start();
}

Класс файла:

private readonly int _id;
private string _path;
private string _filename;
private double _limit;
private bool _high_stimulus_output;
private bool _normalized_data_output;
private List<Cell> _cells;
private int _cellCount;
private int _rowCount;
private double _minutes;
private string[] _content;

public File(int ID, string Path, string FileName, double Limit,bool High_Stimulus_Output, bool Normalized_Data_Ouput, List<Cell> Cells, int CellCount, int RowCount, double Minutes, string[] Content)
{
    _id = ID;
    _filename = FileName;
    _path = Path;
    _limit = Limit;
    _high_stimulus_output = High_Stimulus_Output;
    _normalized_data_output = Normalized_Data_Ouput;
    _cells = Cells;
    _cellCount = CellCount;
    _rowCount = RowCount;
    _minutes = Minutes;
    _content = Content;
}

public string FileName { get => _filename; set => _filename = value; }
public int ID { get => _id;}
public string Path { get => _path; set => _path = value; }
public double Limit { get => _limit; set => _limit = value; }
public bool High_Stimulus_Output { get => _high_stimulus_output; set => _high_stimulus_output = value; }
public bool Normalized_data_output { get => _normalized_data_output; set => _normalized_data_output = value; }
public int CellCount { get => _cellCount; set => _cellCount = value; }
public int RowCount { get => _rowCount; set => _rowCount = value; }
public double Minutes { get => _minutes; set => _minutes = value; }
public string[] Content { get => _content; set => _content = value; }
internal List<Cell> Cells { get => _cells; set => _cells = value; }

Класс сотовой связи:

class Cell 
{
    private string _name;
    private List<TimeFrame> _time_frames;
    private double _baseline_mean;
    private double _all_mean;
    private List<TimeFrame> _normalized_time_frames;
    private double _maximum;
    private double _over_under_limit;
    private int _high_stimulus_per_minute;

    public Cell(string Name, List<TimeFrame> Timeframes, double Baseline_Mean, double All_Mean, List<TimeFrame> Normalized_Timeframes, double Maximum, double Over_Under_Limit, int High_Stimulus_Per_Minute) {
        _name = Name;
        _time_frames = Timeframes;
        _baseline_mean = Baseline_Mean;
        _all_mean = All_Mean;
        _normalized_time_frames = Normalized_Timeframes;
        _maximum = Maximum;
        _over_under_limit = Over_Under_Limit;
        _high_stimulus_per_minute = High_Stimulus_Per_Minute;
    }

    public string Name { get => _name; set => _name = value; }
    public List<TimeFrame> Timeframes { get => _time_frames; set => _time_frames = value; }
    public double Baseline_Mean { get => _baseline_mean; set => _baseline_mean = value; }
    public double All_mean { get => _all_mean; set => _all_mean = value; }
    public List<TimeFrame> Normalized_Timeframes { get => _normalized_time_frames; set => _normalized_time_frames = value; }
    public double Maximum { get => _maximum; set => _maximum = value; }
    public double Over_under_limit { get => _over_under_limit; set => _over_under_limit = value; }
    public int High_stimulus_per_minute { get => _high_stimulus_per_minute; set => _high_stimulus_per_minute = value; }
}

Класс TimeFrame:

class TimeFrame 
{
    private readonly int _id;
    private readonly double _value;
    private readonly int _including_minute;

    public TimeFrame(int ID, double Value, int Including_Minute) {
        _id = ID;
        _value = Value;
        _including_minute = Including_Minute;
    }

    public int ID { get => _id; }
    public double Value { get => _value; }
    public int Minute { get => _including_minute; }
}

Я искал несколько часов и пробовал несколько решений, найденных на github, но безуспешно. Я думаю, что-то не так с привязками? Или есть что-то еще, что я едва пропустил?

Заранее спасибо.

Actual State

1 Ответ

0 голосов
/ 18 января 2019

Наиболее очевидная причина в том, что вы не установили DataContext для TabControl. При связывании данных вы не динамически создаете TabItems и не добавляете их в TabControl, вы просто задаете DataContext, а TabItems, а также DataGrid в каждом TabItem заполняются для вас.

Так что вместо

foreach (File file in Globals.Files) {
                TabItem item = new TabItem {
                    Header = file.FileName.Split('.')[0]
                };


                item.Content = file.Cells;
                TabControlCells.Items.Add(item);


            }

Вы просто указываете его

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