簡體   English   中英

標簽控件中的C#WPF Datagrid(動態創建)未顯示數據

[英]C# WPF Datagrid in Tab Control (dynamically created) not showing Data

我嘗試為每個創建的Tab創建一個具有集成Datagrid的動態創建的TabControl。 為什么動態創建選項卡? 用戶可以打開多個文件,所選文件的數量就是選項卡的數量。 為什么在選項卡中使用Datagrid。 每個選項卡(將來)都包含大量的計算數據,這些數據應顯示在Datagrid中。

這種方法在每個選項卡中都顯示了Datagrid,並且還顯示了“名稱”列,但是在其下方未顯示任何數據。

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上找到的幾種解決方案,但沒有成功。 我認為綁定有問題嗎? 還是我幾乎不會錯過的其他東西?

提前致謝。

實際狀態

最明顯的原因是您尚未為TabControl設置DataContext。 使用數據綁定,您無需動態創建TabItem並將其添加到TabControl中,只需設置DataContext即可為每個TabItem填充TabItems以及DataGrid。

所以代替

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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM