0

I have a WPF (.NET 4) DataGrid backed by a DataView from a DataTable, which has as one of its columns a DataGridComboBoxColumn. Everything is working for me, but I had to create a new class to hold the contents of what is a simple [ArrayList/List<string>/whatever IEnumerable I can try] for the possible values of the DGCBC, when it seems like there should be a less-convoluted way. Here is my XAML:

<Window x:Class="MASTableMaint.TruckloadLimitsEdit"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Edit Truckload Limits" Height="600" Width="460" MinWidth="300" MinHeight="300"  WindowStartupLocation="CenterOwner" >
    <DockPanel LastChildFill="True">
        <DataGrid Name="TruckloadGrid" ItemsSource="{Binding}" CanUserReorderColumns="False" CanUserResizeRows="False" CanUserSortColumns="False"
                  AutoGenerateColumns="False" RowHeaderWidth="20">
            <DataGrid.Columns>
                <DataGridComboBoxColumn x:Name="companyIdColumn" Header="Company" SelectedValueBinding="{Binding Path=CompanyID}" 
                    DisplayMemberPath="TheCompanyID" SelectedValuePath="TheCompanyID"/>
                ...
            </DataGrid.Columns>
        </DataGrid>
    </DockPanel>
</Window>

And my code behind:

namespace MASTableMaint
{
    public partial class TruckloadLimitsEdit : Window
    {
        private DataTable truckloadDT = new DataTable();
        private SqlDataAdapter truckloadDA;
        private SqlConnection sqlconn;


        public TruckloadLimitsEdit(List<string> massCompanies)
        {
            sqlconn = new SqlConnection(Constants.SqlConnectionStr);

            if (!DbUtils.OpenDbConn(sqlconn))
            {
                sqlconn.Dispose();
                return;
            }

            string query = "SELECT * FROM tTruckload ORDER BY CompanyID";
            truckloadDA = new SqlDataAdapter(query, sqlconn);
            truckloadDA.Fill(truckloadDT);
            SqlCommandBuilder builder = new SqlCommandBuilder(truckloadDA);

            InitializeComponent();

            DataView truckloadDV = new DataView(truckloadDT, null, null, DataViewRowState.CurrentRows);
            TruckloadGrid.ItemsSource = truckloadDV;

            ObservableCollection<MassCompany> ocMassCompanies = new ObservableCollection<MassCompany>();

            foreach (string company in massCompanies)
            {
                ocMasCompanies.Add(new MassCompany(company));
            }
            companyIdColumn.ItemsSource = ocMassCompanies;
        }
        ...
    }


    public class MassCompany
    {
        public MassCompany(string company)
        {
            TheCompanyID = company;
        }

        public string TheCompanyID { get; set; }
    }
}
Conrad
  • 2,197
  • 28
  • 53

1 Answers1

0

It seems that the collection is shared for all rows.

If so, define a dependency property of type ObservableCollection<MassCompany> on your window (we'll call it WinMassCompanies).

Then in constructor:

WinMassCompanies = new ObservableCollection<MassCompany>();
foreach (string company in massCompanies)
{
    WinMassCompanies.Add(new MassCompany(company));
}
//don't fiddle with the column

In XAML:

<DataGridComboBoxColumn ItemsSource="{Binding WinMassCompanies,
                                              RelativeSource={RelativeSource Mode=FindAncestor,
                                                                             AncestorType={x:Type Window}}}" 
...../>
XAMeLi
  • 6,189
  • 2
  • 22
  • 29
  • Thanks for this. However, I when I try this it breaks and the Company column is blank. Is this the correct DP here? `public ObservableCollection WinMassCompanies { get { return (ObservableCollection)GetValue(MassCompaniesProperty); } set { SetValue(MassCompaniesProperty, value); } } public static readonly DependencyProperty MassCompaniesProperty = DependencyProperty.Register("WinMassCompanies", typeof(ObservableCollection), typeof(TruckloadLimitsEdit), new UIPropertyMetadata());` – Conrad May 08 '13 at 13:54
  • I guess what I'm really wondering about is why I just can't have `companyIdColumn.ItemsSource = massCompanies;` and skip the extra class creation/etc if the contents of the ComboBox are static. – Conrad May 08 '13 at 15:17