繁体   English   中英

子datagrid中的c#wpf组合框列

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM