none
(WPF) 請問如何在DataGrid中實作出被分組過後的ComboBox欄位 RRS feed

  • 問題

  • 目前是依照單一ComboBox進行分組的方式加入Constrain,不過沒辦法成功,想請問問題出在哪?

    唯一能夠實現分組ComboBox的方始只有使用ListCollectionView針對單一ComboBox進行設定,還無法在DataGrid中實現。

    ComboBox的示意圖如下圖所示

    P.S. 我接觸C#還不到一個月,如果可以麻煩講解一下原理

    CS檔                                       

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    using Newtonsoft.Json;
    using CaxGlobaltek;
    using NHibernate;
    using System.Collections.ObjectModel;


    namespace PEDlg
    {
        /// <summary>
        /// MainWindow.xaml 的互動邏輯
        /// </summary>
        /// 
        public class ProcessList
        {
            public ProcessList()
            {

            }

            public string GroupName { get; set; }
            public string ProcessName { get; set; }
        }

        public class Process : List<string>
        {
            public Process()
            {
                this.Add("Blank");
                this.Add("Turning");
                this.Add("Turn-Millng");
                this.Add("Marking");
                this.Add("Deburring");
                this.Add("Appearance check & Packaging");
            }
        }

        public partial class MainWindow : Window
        {
            public class PECreateData
            {
                public virtual string cusName { get; set; }
                public virtual string partName { get; set; }
                public virtual string partDesc { get; set; }
                public virtual string material { get; set; }
                public virtual string cusRev { get; set; }
                public virtual string opRev { get; set; }
                public virtual string partFilePath { get; set; }
                public virtual string billetFilePath { get; set; }
                public virtual string head_tail { get; set; }
                public virtual string removeNum { get; set; }
                public virtual string erp { get; set; }
                public virtual string materialResource { get; set; }
                public virtual List<Operation> listOperation { get; set; }
                public virtual List<string> oper1Ary { get; set; }
                public virtual List<string> oper2Ary { get; set; }

                //public string PartPath { get; set; }
            }

            public class OperationArray
            {
                public List<string> Operation1Array { get; set; }
                public List<string> Operation2Array { get; set; }
            }

            public class Operation
            {
                public string Oper1 { get; set; }
                public string Oper2 { get; set; }
                public string ERPCode { get; set; }
                public string Form { get; set; }
                //public string CAMFolderPath { get; set; }
                //public string OISFolderPath { get; set; }
                //public string ThridOperPartPath { get; set; }
            }

            public enum OperDiscrib { Blank, Turning, Turn_Millng, Marking, Deburring, Appearance_Check_Packaging };

            public class OperInfor
            {
                public string str_OperNum { get; set; }
                public string str_Process { get; set; }
                public bool b_IQC { get; set; }
                public bool b_IPQC { get; set; }
                public bool b_Step { get; set; }
                public bool b_Outsource { get; set; }
                public string str_ERP { get; set; }
                public List<string> All_OpD { get; set; }

                public OperInfor()
                {
                    str_OperNum = ""; ;
                    str_Process = "Blank";
                    str_ERP = "";
                    b_IQC = false;
                    b_IPQC = false;
                    b_Step = false;
                    b_Outsource = false;
                }
            }

            public class CusName
            {
                public List<string> CustomerName { get; set; }
            }

            private ObservableCollection<ProcessList> _Pros;
            public ObservableCollection<ProcessList> Pros
            {
                get { return _Pros; }
                set { _Pros = value; }
            }

            const string str_Company_Synsir = "Synsir";
            const string str_Company_Hexagon = "Hexagon";

            private void FillComboBoxDummyData()
            {
                _Pros = new ObservableCollection<ProcessList> ();

                // Add Synsir Group
                _Pros.Add(new ProcessList { GroupName = str_Company_Synsir, ProcessName = "Blank" });
                _Pros.Add(new ProcessList { GroupName = str_Company_Synsir, ProcessName = "Turning" });
                _Pros.Add(new ProcessList { GroupName = str_Company_Synsir, ProcessName = "Turn-Millng" });
                _Pros.Add(new ProcessList { GroupName = str_Company_Synsir, ProcessName = "Marking" });

                //Add Hexagon Group         
                _Pros.Add(new ProcessList { GroupName = str_Company_Hexagon, ProcessName = "Deburring" });
                _Pros.Add(new ProcessList { GroupName = str_Company_Hexagon, ProcessName = "Appearance check & Packaging" });
            }

            public MainWindow()
            {
                InitializeComponent();

                FillComboBoxDummyData();

                //Load PE Json - Start
                string JasonPath = @"D:\Test\PE Dialog Test\PECreateData.dat";

                PECreateData PE_Data = null;

                if (PE_Data == null)
                    PE_Data = new PECreateData();

                ReadJsonData(JasonPath, out PE_Data);
                //Load PE Json - End
                //Put PE Infor into DataGrid - Start
                ObservableCollection<OperInfor> OpersData = new ObservableCollection<OperInfor>();

                foreach (Operation oper in PE_Data.listOperation)
                {
                    OperInfor opinfor = new OperInfor();

                    opinfor.str_OperNum = oper.Oper1;

                    opinfor.str_Process = oper.Oper2;

                    opinfor.str_ERP = oper.ERPCode;

                    if (oper.Form == "IQC")
                        opinfor.b_IQC = true;

                    if (oper.Form == "IPQC")
                        opinfor.b_IPQC = true;

                    if (oper.Form == "Step")
                        opinfor.b_Step = true;

                    if (oper.Form == "Outsource")
                        opinfor.b_Outsource = true;

                    OpersData.Add(opinfor);
                }

                dataGrid.ItemsSource = OpersData;
                //Put PE Infor into DataGrid - End
            }
        }
    }

    XAML檔

    <Window x:Class="PEDlg.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:PEDlg"
            xmlns:col="clr-namespace:PEDlg"
            xmlns:static="clr-namespace:PEDlg"
            xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase"
            mc:Ignorable="d"
            Title="MainWindow" Height="524.4" Width="800">
        <Window.Resources>
            <static:Process x:Key="Process">
            </static:Process>
            <CollectionViewSource x:Key="GroupedData" Source="{Binding Pros}">
                <CollectionViewSource.GroupDescriptions>
                    <PropertyGroupDescription PropertyName="GroupName">
                    </PropertyGroupDescription>
                </CollectionViewSource.GroupDescriptions>
            </CollectionViewSource>
            <DataTemplate x:Key="GroupHeader">
                <TextBlock Text="{Binding GroupName}" Margin="10,0,0,0" Foreground="#989791" />
            </DataTemplate>
            <DataTemplate x:Key="ProTemplate">
                <TextBlock Text="{Binding ProcessName}" Margin="10,0,0,0"/>
            </DataTemplate>
            <Style x:Key="containerStyle"  TargetType="{x:Type GroupItem}">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type GroupItem}">
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </Window.Resources>
        <Grid Margin="0,0,-156.4,-111.8">
            <DataGrid x:Name="dataGrid" HorizontalAlignment="Left" Height="420" Margin="50,30,0,0" VerticalAlignment="Top" Width="700" AutoGenerateColumns="False" SelectionChanged="dataGrid_SelectionChanged">
                <DataGrid.Columns>
                    
                    <DataGridTextColumn Binding="{Binding str_OperNum}" Header="PE No." Width="70"/>
                    
                    <DataGridTemplateColumn Header="Process" Width="175">
                        <!--<DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding str_Process}"/>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>-->
                        <DataGridTemplateColumn.CellEditingTemplate>
                            <DataTemplate>
                                <!--<ComboBox Height="22" ItemsSource="{StaticResource Process}" SelectedItem="{Binding str_Process}">-->
                                <ComboBox Height="22" ItemsSource="{Binding Source={StaticResource GroupedData}}" ItemTemplate="{StaticResource ProTemplate}">
                                    <ComboBox.GroupStyle>
                                        <GroupStyle ContainerStyle="{StaticResource containerStyle}" HeaderTemplate="{StaticResource GroupHeader}">
                                        </GroupStyle>
                                    </ComboBox.GroupStyle>
                                </ComboBox>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellEditingTemplate>
                    </DataGridTemplateColumn>
                    
                    <DataGridTemplateColumn Header="IQC" Width="50">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <CheckBox IsChecked= "{Binding b_IQC}" />
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>

                    <DataGridTemplateColumn Header="IPQC" Width="50">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <CheckBox IsChecked= "{Binding b_IPQC}" />
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>

                    <DataGridTemplateColumn Header="Step" Width="50">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <CheckBox IsChecked= "{Binding b_Step}" />
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>

                    <DataGridTemplateColumn Header="Outsource" Width="50">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <CheckBox IsChecked= "{Binding b_Outsource}" />
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>

                    <DataGridTextColumn Binding="{Binding str_ERP}" Header="ERP Material" Width="*"/>
                </DataGrid.Columns>
            </DataGrid>
        </Grid>
    </Window>


    2018年12月10日 上午 07:57