[英]c# wpf combobox column in child datagrid
我正在使用具有两个DataGrid的WPF应用程序-一个用于TimeCard对象,另一个用于时间卡线(“ TcLine”)对象。 时间卡和TcLine之间存在一对多关系。 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
直接在SelectionChanged方法中设置项目可防止DataGrid项目可编辑。 改为设置ItemsSource。 您确实可以单线执行此操作:
private void TimeCardGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
TcLineGrid.ItemsSource = (TimeCardGrid.SelectedItem as TimeCard)?.TcLines;
}
您可以在MainWindow的构造函数中轻松设置的ComboBox的ItemsSource。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.