我正在尝试取消链接到数据库的任务列表调度程序。根据任务组,每个任务作为特定依赖项,此路径取决于数据库关系。
WPF表单包含每行工作时间(30分钟)的模板。在初始化时,表单应该读取数据库,查找当天的条目并在正确的行(句点)中填充它们。
我的问题是,对于这种情况,哪种解决方案最好?我将需要分隔为模板的行(30m句点),即使它们是空白的,也需要OnDoubleClick类似的事件来触发任务条目。
更新: 模板
Project | Product | Task | SubTask
07:30
08:00 XXXX XXXX XXXX XXXX
08:30
答案 0 :(得分:1)
首先尝试创建线框,并从用户的角度看看更有意义的内容。创建线框后,我会创建一个简单的原型并针对您的用户进行测试,以便您能够知道每个控件的优缺点。其次,除了获得为特定任务构建的内置控件之外,使用Grid,DataGrid或其他控件之间确实没有区别。
控件是否满足您的要求?你不知道,在你创建它之前没有人做过,测试和验证它。
在我看来,如果你有一个非常大的数据集,那么DataGrid将节省你的时间,因为控件已经为你提供了处理它们的解决方案。如果您使用网格或自定义控件,那么您必须自己处理它。
无论您选择何种控件,您仍然可以拥有相同的业务要求,并且对于您选择的控件,UI逻辑的编码几乎相同。
答案 1 :(得分:0)
这是一个非常粗略的模仿我正在谈论的内容......
public partial class MainWindow : Window
{
public List<Schedule> _schedules { get; set; }
List<MyTask> _dbContext = new List<MyTask>();
public MainWindow()
{
InitializeComponent();
_schedules = new List<Schedule>();
LoadTimeIntervals(DateTime.Now);
LoadDbContext();
LoadTasks();
DataContext = this;
}
private void LoadTimeIntervals(DateTime selectedDate)
{
var starting = DateTime.Parse(selectedDate.Date.ToShortDateString() + " 00:00:00");
for (var i = starting; i < DateTime.Parse(selectedDate.Date.ToShortDateString() + " 23:59:00"); i += new TimeSpan(0, 30, 0))
{
_schedules.Add(new Schedule() { TaskDT = i, Tasks = new List<MyTask>() });
}
}
private void LoadTasks()
{
foreach (var interval in _schedules)
{
interval.Tasks = _dbContext.Where(x => x.DueDt == interval.TaskDT).ToList();
}
}
private void LoadDbContext()
{
for (int i = 1; i < 24; i++)
{
if ((i & 1) == 0)
_dbContext.Add(new MyTask() { DueDt = DateTime.Parse(DateTime.Now.Date.ToShortDateString() + " " + i.ToString().PadLeft(2, '0') + ":00:00"), Name = "Task #" + i.ToString(), Completed = false });
}
for (int i = 1; i < 24; i++)
{
if ((i & 1) == 0)
_dbContext.Add(new MyTask() { DueDt = DateTime.Parse(DateTime.Now.Date.ToShortDateString() + " " + i.ToString().PadLeft(2, '0') + ":00:00"), Name = "Task #" + i + 24, Completed = false });
}
}
}
public class Schedule
{
public DateTime TaskDT { get; set; }
public List<MyTask> Tasks { get; set; }
}
public class MyTask
{
public DateTime DueDt { get; set; }
public string Name { get; set; }
public bool Completed { get; set; }
}
和XAML ......
<Grid>
<ItemsControl ItemsSource="{Binding _schedules}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Vertical" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding TaskDT}" Margin="3" />
<ItemsControl ItemsSource="{Binding Tasks}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Vertical" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Name}" Margin="3" />
<TextBlock Text="{Binding DueDt, StringFormat={}Due: {0}}" Margin="3" />
<CheckBox IsChecked="{Binding Completed}" Content="Status:" Margin="3" />
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid>
再次,这是一个粗略的模拟和分钟。风格和功能。已经完成,但你可以看到这是如何开始的。如果您需要样式方面的帮助,请告诉我,我可以发布更多代码来帮助您。