【发布时间】:2018-06-27 20:26:20
【问题描述】:
我正在开发一个带有两个 DataGrid 的 WPF 应用程序——一个用于 TimeCard 对象,另一个用于时间卡线 (“TcLine”) 对象。 TimeCards 和 TcLines 之间存在一对多的关系。 TimeCard 数据网格设置有一个 SelectionChanged 事件,该事件用相关的 TcLine 记录填充子数据网格。该事件工作正常,但我想让这个 TcLine 数据网格包含一个 DataGridComboBoxColumn 以允许用户从下拉列表中更改给定行的批准状态。到目前为止,我还无法让 DataGridComboBoxColumn 工作。这是 XAML:
<Grid>
<DataGrid x:Name="TimeCardGrid" HorizontalAlignment="Left"
Height="100" Margin="62,30,0,0" VerticalAlignment="Top"
Width="454" AutoGenerateColumns="False"
SelectionChanged="TimeCardGrid_SelectionChanged">
<DataGrid.Columns>
<DataGridTextColumn Header="Id" Binding="{Binding EmployeeId}"
Width="75"></DataGridTextColumn>
<DataGridTextColumn Header="Week Ending"
Binding="{Binding WeekEnding}"
Width="*"></DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
<DataGrid x:Name="TcLineGrid" HorizontalAlignment="Left" Height="154" Margin="85,207,0,0"
VerticalAlignment="Top" Width="431" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Job Number"
Binding="{Binding JobNumber}" Width="80"/>
<DataGridTextColumn Header="Phase Code"
Binding="{Binding PhaseCode}" Width="80"/>
<DataGridTextColumn Header="Rate Factor"
Binding="{Binding RateFactor}" Width="80"/>
<DataGridComboBoxColumn Header="Mon Approval" x:Name="MondayApproval" Width="90"
SelectedItemBinding="{Binding MondayApproval, Mode=TwoWay}"
DisplayMemberPath="{Binding MondayApproval}"/>
<DataGridTextColumn Header="Monday" Binding="{Binding MondayHours}" Width="*"/>
</DataGrid.Columns>
</DataGrid>
</Grid>
下面是主窗口的代码:
public partial class MainWindow : Window
{
List<TimeCard> timeCards;
List<string> approvalStatuses;
TimeCard timeCard1;
TimeCard timeCard2;
public MainWindow()
{
InitializeComponent();
//load timncard objects
timeCard1 = new TimeCard(1, DateTime.Parse("1/5/2018"));
timeCard1.TcLines.Add(new TcLine(DateTime.Parse("1/5/2018"), "941119", "009-150-", 1.0));
timeCard1.TcLines.Add(new TcLine(DateTime.Parse("1/5/2018"), "941119", "009-150-", 1.5));
timeCard1.TcLines.Add(new TcLine(DateTime.Parse("1/5/2018"), "941119", "009-800-", 0.0));
timeCard2 = new TimeCard(2, DateTime.Parse("1/5/2018"));
timeCard2.TcLines.Add(new TcLine(DateTime.Parse("1/5/2018"), "971290", "009-151-", 1.0));
timeCard2.TcLines.Add(new TcLine(DateTime.Parse("1/5/2018"), "971290", "009-151-", 1.5));
timeCard2.TcLines.Add(new TcLine(DateTime.Parse("1/5/2018"), "971290", "009-800-", 0.0));
timeCards = new List<TimeCard> { timeCard1, timeCard2 };
TimeCardGrid.ItemsSource = timeCards;
//load approval status combobox options
approvalStatuses = new List<string>
{
"Approved",
"Unapproved"
};
}
private void TimeCardGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
TcLineGrid.Items.Clear();
object item = TimeCardGrid.SelectedItem;
int id = int.Parse((TimeCardGrid.SelectedCells[0].Column.GetCellContent(item) as TextBlock).Text);
DateTime weekEnding = DateTime.Parse((TimeCardGrid.SelectedCells[1].Column.GetCellContent(item) as TextBlock).Text);
var timeCard = timeCards.Where(t => t.EmployeeId == id && t.WeekEnding == weekEnding).FirstOrDefault();
foreach (var line in timeCard.TcLines)
{
TcLineGrid.Items.Add(line);
}
//set combobox column item source
MondayApproval.ItemsSource = approvalStatuses;
}
这些是我的模型:
public class TimeCard
{
public TimeCard() { TcLines = new List<TcLine>(); }
public TimeCard(int employeeId, DateTime weekEnding)
{
EmployeeId = employeeId;
WeekEnding = weekEnding;
TcLines = new List<TcLine>();
}
public int EmployeeId { get; set; }
public DateTime WeekEnding { get; set; }
public List<TcLine> TcLines { get; set; }
public double PerDiem { get; set; }
}
public class TcLine
{
public TcLine(DateTime weekEnding, string jobNumber, string phaseCode, double rateFactor)
{
JobNumber = jobNumber;
PhaseCode = phaseCode;
RateFactor = rateFactor;
MondayHours = 0.0;
MondayApproval = "A";
}
public string JobNumber { get; set; }
public string PhaseCode { get; set; }
public double RateFactor { get; set; }
public double MondayHours { get; set; }
public string MondayApproval { get; set; }
}
}
我尝试了一个没有时间卡对象和网格的版本,并且 DataGridComboBoxColumn 的 XAML 工作正常,所以我猜测问题与我的 SelectionChanged 事件有关。我尝试将此列的 ItemSource 属性的赋值从主窗口构造函数移动到选择更改方法中,但这不起作用。有没有人遇到过类似的问题?很抱歉冗长和 TIA
【问题讨论】: