将数据表分配为tabitem.content时获取System.Data.DataRows而不是实际值

时间:2018-10-25 04:44:36

标签: c# wpf xaml datatable

public void LoadData()
{
    sy.OpenFileDialog op = new sy.OpenFileDialog();
    op.Multiselect = true;

    if (op.ShowDialog() == sy.DialogResult.OK)
    {
        for each (string s in op.FileNames)
        {
            val = s;
            values = s.Split('\\');
            lastItem = values[values.Length - 1];                   
            newTabItem = new TabItem
            {
                Header = lastItem,
            };
            tabControl1.Items.Add(newTabItem);
            ReadJsonFile();                   

            DataTable dt = new DataTable();
            dt.Columns.Add("Day", typeof(string));
            dt.Columns.Add("Date", typeof(string));
            dt.Columns.Add("Time", typeof(string));
            dt.Columns.Add("Lat", typeof(string));
            dt.Columns.Add("Long", typeof(string));
            dt.Columns.Add("Address", typeof(string));
            dt.Columns.Add("Type", typeof(string));

            foreach (var item in data)
            {
                dt.Rows.Add(item.getDay(), item.getDate(), item.getTime(), item.getLat(), item.getLongi(), item.getAddresst(), item.getTYpe());                    
            }
            newTabItem.Content =  dt;

        }
    }
}

public void ReadJsonFile()
{
    string json = string.Empty;

    using (StreamReader r = new StreamReader(val))
    {
        json = r.ReadToEnd();
        var test = JObject.Parse(json);
        JArray items = (JArray)test["locations"];
        int length = items.Count;
        data = new List<Info>();

        for (int i = 0; i < items.Count; i++)
        {
            var d = test["locations"][i]["timestampMs"];
            double dTimeSpan = Convert.ToDouble(d);
            DateTime dtReturn = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddSeconds(Math.Round(dTimeSpan / 1000d)).ToLocalTime();
            string printDate = dtReturn.DayOfWeek.ToString() + "," + " " + dtReturn.ToShortDateString() + " " + dtReturn.ToShortTimeString();
            day = dtReturn.DayOfWeek.ToString();
            date = dtReturn.ToShortDateString();
            time = dtReturn.ToShortTimeString();
            var e = test["locations"][i]["latitudeE7"];
            var f = test["locations"][i]["longitudeE7"];
            //getLocationByGeoLocation(e.ToString(), f.ToString());                   
            var g = test["locations"][i]["activity"] != null;

            if (g == true)
            {
                JArray items1 = (JArray)test["locations"][i]["activity"];
                int length1 = items1.Count;

                while (j < items1.Count )
                {
                    if(j == 0)
                    { 
                        var h = test["locations"][i]["activity"][j]["activity"][j]["type"];
                        type = h.ToString();
                        j = 1;
                    }
                    else { }
                    j++;
                }
                j = 0;
            }
            else { }

            Info ddm = new Info(day, date, time, lat, longi, address, type);
            data.Add(ddm);                   
        }
    }
    return;
}

enter image description here

我希望在绑定了数据网格的tabitem上获得这样的值,但我却变得如此

enter image description here

这是我的xaml文件代码

<DockPanel Height="auto" Width="auto">
    <DockPanel Height="auto" Width="auto" DockPanel.Dock="Top"  HorizontalAlignment="Stretch" VerticalAlignment="Stretch" LastChildFill="True"  >
        <TabControl  x:Name="tabControl1" Height="auto" Width="auto" ItemsSource="{Binding}" TabStripPlacement="Top" SelectionChanged="tabControl1_SelectionChanged" >
            <TabControl.ContentTemplate >
                <DataTemplate>
                    <DataGrid x:Name="dataGrid1" Height="auto" Width="auto" ItemsSource="{Binding}" AutoGenerateColumns="False" >
                        <DataGrid.Columns>
                            <DataGridTextColumn Width="*"  Header="Day"  Binding="{Binding}"/>
                            <DataGridTextColumn Width="*" Header="Date" Binding="{Binding}"/>
                            <DataGridTextColumn Width="*" Header="Time" Binding="{Binding}"/>
                            <DataGridTextColumn Width="*" Header="Lat" Binding="{Binding}"/>
                            <DataGridTextColumn Width="*" Header="Long" Binding="{Binding}"/>
                            <DataGridTextColumn Width="*" Header="Address" Binding="{Binding}"/>
                            <DataGridTextColumn Width="*" Header="Type" Binding="{Binding}"/>
                        </DataGrid.Columns>
                    </DataGrid>
                </DataTemplate>
            </TabControl.ContentTemplate>
        </TabControl>
    </DockPanel>
</DockPanel>

如何将数据表显示为选项卡项目内容以显示实际值 第一张图片显示了数据表的值,该值我要显示在选项卡上绑定的网格上。

第二张图片是我获得的值,而不是实际值。

1 个答案:

答案 0 :(得分:1)

您应该在每列中设置正确的绑定路径。使用{Binding}会在每个单元格中产生DataRow,因为{Binding}意味着整行都应显示在该单元格中,唯一的方法是调用DataRow.ToString()并显示结果。

您需要在绑定中指定行字段:

<DataGridTextColumn Width="*"  Header="Day"  Binding="{Binding [Day]}"/>
<DataGridTextColumn Width="*" Header="Date" Binding="{Binding [Date]}"/>
<DataGridTextColumn Width="*" Header="Time" Binding="{Binding [Time]}"/>
<DataGridTextColumn Width="*" Header="Lat" Binding="{Binding [Lat]}"/>
<DataGridTextColumn Width="*" Header="Long" Binding="{Binding [Long]}"/>
<DataGridTextColumn Width="*" Header="Address" Binding="{Binding [Address]}"/>
<DataGridTextColumn Width="*" Header="Type" Binding="{Binding [Type]}"/>