【发布时间】:2016-12-05 14:16:01
【问题描述】:
每次调用函数时,我都会尝试将数据从变量添加到数据网格。此外,我确保每次调用函数时都会清除网格。但是每次我调用该函数时都会附加数据。谁能帮我这个?数据绑定是一个包含字符串变量作为成员的类。
XAML
<TextBox
x:Name="TextOutput"
HorizontalAlignment="Left"
Height="44"
Margin="23,56,0,0"
Grid.Row="9"
TextWrapping="Wrap"
VerticalAlignment="Top"
Width="545"
Grid.ColumnSpan="2"
BorderBrush="{DynamicResource {x:Static SystemColors.DesktopBrushKey}}"
/>
<Button
x:Name="bootUpMsg"
Content="Read Boot Up Msg"
Margin="22,28,59,0"
Grid.Row="9"
VerticalAlignment="Top"
Click="onBootUpClick"
Background="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"
Foreground="{DynamicResource {x:Static SystemColors.ActiveCaptionTextBrushKey}}"
IsEnabled="False"
/>
<Button
x:Name="startRead"
Content="Start Real Data RD"
HorizontalAlignment="Left"
Margin="163,28,0,0"
Grid.Row="9"
VerticalAlignment="Top"
Width="120"
ToolTip="Start reading data"
ToolTipService.ShowDuration="800"
Click="onStartClick"
Grid.ColumnSpan="2"
Background="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"
Foreground="{DynamicResource {x:Static SystemColors.ActiveCaptionTextBrushKey}}"
IsEnabled="False"
/>
<DataGrid
x:Name="dataGrid"
HorizontalAlignment="Left"
Margin="12,110,0,0"
Grid.Row="9"
VerticalAlignment="Top"
Height="352"
Width="858"
Grid.ColumnSpan="3"
BorderBrush="{DynamicResource {x:Static SystemColors.DesktopBrushKey}}"
Background="{DynamicResource {x:Static SystemColors.GradientInactiveCaptionBrushKey}}"
Foreground="{DynamicResource {x:Static SystemColors.ActiveCaptionTextBrushKey}}"
>
<DataGrid.Columns>
<DataGridTextColumn Header="Sl.No" Width="50" Binding="{Binding Path=Sl_No}"/>
<DataGridTextColumn Header="Task ID" Width="50" Binding="{Binding Path=TaskID}"/>
<DataGridTextColumn Header="Task Name" Width="150" Binding="{Binding Path=TaskName}"/>
<DataGridTextColumn Header="Core ID" Width="50" Binding="{Binding Path=CoreID}" />
<DataGridTextColumn Header="Start Time (μs)" Width="100" Binding="{Binding Path=StartTime}"/>
<DataGridTextColumn Header="End Time (μs)" Width="100" Binding="{Binding Path=StopTime}"/>
<DataGridTextColumn Header="Run Time(μs)" Width="80" Binding="{Binding Path=ExecutedTime}"/>
<DataGridTextColumn Header="Runnable Address" Width="105" Binding="{Binding Path=FunctAdd}"/>
<DataGridTextColumn Header="Runnable Name" Width="200" Binding="{Binding Path=FunctName}"/>
</DataGrid.Columns>
</DataGrid>
C#
public void displayDetails(int scale)
{
dGrid.Items.Clear();
dGrid.Items.Refresh();
int taskCount = 0;
int tasklevel = 0;
List<dataBinding> griddata=new List<dataBinding>();
CTask interruptedtask;
System.Collections.Stack taskstack = new System.Collections.Stack();
int slCnt = 0;
foreach (CCore c in _viewModel.coreList)
{
c.taskList.Sort();//sorting of tasks in tasklist before plotting
taskCount = 0;
tasklevel = 0;
foreach (CTask t in c.taskList)
{
slCnt++;
var data = new dataBinding
{
Sl_No = slCnt.ToString(),
FunctName = "-",
FunctAdd = "-",
StartTime = t.taskStartTime.ToString(),
StopTime = t.taskEndTime.ToString(),
CoreID = c.coreName.ToString(),
TaskID = t.task_id.ToString(),
TaskName = t.taskName,
ExecutedTime = t.runTime.ToString(),
};
dGrid.Items.Add(data);
if (taskstack.Count == 0)
{
taskstack.Push(t);
}
else
{
while (taskstack.Count != 0)
{
interruptedtask = (CTask)taskstack.Pop();
if (t.taskStartTime > interruptedtask.taskStartTime && t.taskEndTime < interruptedtask.taskEndTime)
{
tasklevel++;
taskstack.Push(interruptedtask);
taskstack.Push(t);
break;
}
else
{
if (taskstack.Count == 0)
{
taskstack.Push(t);
break;
}
if (tasklevel != 0)
{
tasklevel--;
}
}
}
}
++taskCount;
if (t.taskEndTime != 0)
{
currentTaskRect = new Rectangle
{
Width = horizonatlZoom * 40 * (Math.Abs((t.taskEndTime - t.taskStartTime) / scale)),
Height = 10 + (verticalZoom) * 2,
Fill = _taskcolour[t.task_id],
Stroke = Brushes.Black,
StrokeThickness = .4,
ToolTip = t.taskName + " : " + t.taskStartTime + " - " + t.taskEndTime + ", Duration-" + (t.taskEndTime - t.taskStartTime) + "μs"
};
}
switch (c.coreName)
{
case "core0":
if (t.taskEndTime != 0)
_myCanvas.Width = ((t.taskEndTime + scale) * 40 * horizonatlZoom) / scale;
_myCanvas.MaxWidth = _myCanvas.Width;
if (!_myCanvas.Children.Contains(currentTaskRect))
{
_myCanvas.Children.Add(currentTaskRect);
Canvas.SetLeft(currentTaskRect, horizonatlZoom * 40 * ((t.taskStartTime) / scale));
Canvas.SetBottom(currentTaskRect, 420 + tasklevel * (35 + (verticalZoom) * 4));
}
break;
case "core1":
if (t.taskEndTime != 0)
_myCanvas.Width = ((t.taskEndTime + scale) * 40 * horizonatlZoom) / scale;
if (!_myCanvas.Children.Contains(currentTaskRect))
{
_myCanvas.Children.Add(currentTaskRect);
Canvas.SetLeft(currentTaskRect, horizonatlZoom * 40 * ((t.taskStartTime) / scale));
Canvas.SetBottom(currentTaskRect, 220 + tasklevel * (35 + (verticalZoom) * 4));
}
break;
case "core2":
if (t.taskEndTime != 0)
_myCanvas.Width = ((t.taskEndTime + scale) * 40 * horizonatlZoom) / scale;
if (!_myCanvas.Children.Contains(currentTaskRect))
{
_myCanvas.Children.Add(currentTaskRect);
Canvas.SetLeft(currentTaskRect, horizonatlZoom * 40 * ((t.taskStartTime) / scale));
Canvas.SetBottom(currentTaskRect, 20 + tasklevel * (35 + (verticalZoom) * 4));
}
break;
default:
if (t.taskEndTime != 0)
_myCanvas.Width = ((t.taskEndTime + scale) * 40 * horizonatlZoom) / scale;
if (!_myCanvas.Children.Contains(currentTaskRect))
{
_myCanvas.Children.Add(currentTaskRect);
Canvas.SetLeft(currentTaskRect, horizonatlZoom * 40 * ((t.taskStartTime) / scale));
Canvas.SetBottom(currentTaskRect, 20 + tasklevel * (35 + (verticalZoom) * 4));
}
break;
}
foreach (CRunnable r in t.runableList)
{
// draw runnable rectangles
slCnt++;
var data2 = new dataBinding
{
Sl_No = slCnt.ToString(),
FunctName = r.runnableName,
FunctAdd = r.runnableaddress.ToString("X"),
StartTime = r.startTime.ToString(),
StopTime = r.endTime.ToString(),
CoreID = c.coreName.ToString(),
TaskID = t.task_id.ToString(),
TaskName = t.taskName,
ExecutedTime = r.runTime.ToString()
};
dGrid.Items.Add(data2);
if (r.endTime != 0)
{
currentTaskRect = new Rectangle
{
Width = horizonatlZoom * 40 * (Math.Abs((r.endTime - r.startTime) / scale)),
Height = 20 + (verticalZoom) * 2,
Fill = r.runnableName == "NOTFOUND" ? brushArray[5] : _runnablecolour[r.runnableaddress.ToString("X")],
Stroke = Brushes.Black,
StrokeThickness = .4,
ToolTip = r.runnableName + " : " + r.startTime + " - " + r.endTime + ", Duration-" + (r.endTime - r.startTime) + "μs"
};
}
switch (c.coreName)
{
case "core0":
if (!_myCanvas.Children.Contains(currentTaskRect))
{
_myCanvas.Children.Add(currentTaskRect);
Canvas.SetLeft(currentTaskRect, horizonatlZoom * 40 * ((r.startTime) / scale));
Canvas.SetBottom(currentTaskRect, 430 + tasklevel * (35 + (verticalZoom) * 4) + (verticalZoom) * 2);
}
break;
case "core1":
if (!_myCanvas.Children.Contains(currentTaskRect))
{
_myCanvas.Children.Add(currentTaskRect);
Canvas.SetLeft(currentTaskRect, horizonatlZoom * 40 * ((r.startTime) / scale));
Canvas.SetBottom(currentTaskRect, 230 + tasklevel * (35 + (verticalZoom) * 4) + (verticalZoom) * 2);
}
break;
case "core2":
if (!_myCanvas.Children.Contains(currentTaskRect))
{
_myCanvas.Children.Add(currentTaskRect);
Canvas.SetLeft(currentTaskRect, horizonatlZoom * 40 * ((r.startTime) / scale));
Canvas.SetBottom(currentTaskRect, 30 + tasklevel * (35 + (verticalZoom) * 4) + (verticalZoom) * 2);
}
break;
default:
if (!_myCanvas.Children.Contains(currentTaskRect))
{
_myCanvas.Children.Add(currentTaskRect);
Canvas.SetLeft(currentTaskRect, horizonatlZoom * 40 * ((r.startTime) / scale));
Canvas.SetBottom(currentTaskRect, 30 + tasklevel * (35 + (verticalZoom) * 4) + (verticalZoom) * 2);
}
break;
}
}
}
}
【问题讨论】:
-
你在哪里设置了 dGrid 数据源?你能不说清楚吗?而不是试图直接操作网格中的项目?
-
其实我没看懂你的问题。我将数据与 xaml 中的数据网格绑定,在上面的函数中,我正在调用 dGrid.items.add(data) ,其中 data 是一个类对象。
-
不,实际上你并没有绑定数据。您正在将其推入 DataGrid 的 Items 集合中。数据绑定将使用 ItemsSource 属性和 XAML 中的 {Binding } 表达式。您在 WPF 上强制使用 WinForms 模式。你正在做的不是 WPF 做事的方式。我不确定您想要达到的效果,但我确信这可以通过使用 DataTemplates 和简单的绑定来完成。这段代码实在是太复杂了。