views:

1093

answers:

1

Hi All,

I am a beginner to MVVM. The main window uses a stock DataGrid from the WPF Toolkit. It has one View Model and relies only on DataContext_Changed event handler in the .xaml.cs file. The main window's DataContext is the View Model.

I am attempting to bind the ItemsSource property of a DataGridComboBoxColumn to a CLR property, "FieldTypes", on the View Model. "FieldTypes" is a List which derives from a Linq to Sql table of type FieldType. The ItemsSource of the DataGrid is from one System.Data.Linq.Table and "FieldTypes" is from a separate Table, and these two tables have no relationship.

To bind the FieldTypes DataGridComboBoxColumn to the "FieldTypes" property on the View Model, I created a DataTemplate StaticResource to be used in a DataGridTemplateColumn:

    <DataTemplate x:Key='FieldTypeCombo' >
        <ComboBox DataContext='{Binding ElementName=window, Mode=OneWay, Path=DataContext, UpdateSourceTrigger=PropertyChanged}'
                  ItemsSource='{Binding FieldTypes}'
                  DisplayMemberPath='Name'
                  />
    </DataTemplate>

It turns out that this DataTemplate will work on a child element of the main window NOT in the DataGrid, such as in a HeaderedContentControl.ContentTemplate, but will not work in a DataGridTemplateColumn.CellTemplate.

If I try binding a DataGridComboBoxColumn to the ComboBox.ItemsSource property of a regular ComboBox not in the DataGrid,

                        <c:DataGridComboBoxColumn Header="FieldType"                                                      
                                      ItemsSource="{Binding ElementName=regularcombobox, Path=ItemsSource, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"                    
                                      />

it works as expected, but not for a ComboBox inside the DataGrid.

I'd like to have as much data binding as possible on the View Model's properties, but this also looks like an opportunity for a StaticResource. This StaticResource would change however, after the window loads, since the connection string is not known until after. Even when binding the ItemsSource of the ComboBox column to the StaticResource, I've had no luck with this, or DynamicResource either.

Is there some way to accomplish this binding of a DataGrid ComboBox column to a collection separate from the ItemsSource of the DataGrid, using MVVM? Or is there a way to accomplish this with a StaticResource,even if the SQL connection changes after the window loads?

A: 

Try replacing the ElementName Binding with this:

{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}, Mode=OneWay, Path=DataContext, UpdateSourceTrigger=PropertyChanged}'

ElementName can only resolve names within a certain scope and it's generally not a good idea to use them inside a DataTemplate to refer to something external (although it will work in some cases).

John Bowen
That worked. I had not realized that about ElementName. I had also looked at the southridge example (http://blogs.msdn.com/jaimer/archive/2009/02/10/m-v-vm-training-day-sample-application-and-decks.aspx)which uses a StaticResource in the Grid.Resources named "spy" that seems to work.
T. Webster