Привязка столбца ComboBox набора инструментов WPF Toolkit к коллекции Linq-to-Sql после загрузки окна и изменения соединения? - PullRequest
0 голосов
/ 05 февраля 2010

Я новичок в MVVM. В главном окне используется стандартный DataGrid из WPF Toolkit. Он имеет одну модель представления и полагается только на обработчик событий DataContext_Changed в файле .xaml.cs. DataContext главного окна - это модель представления.

Я пытаюсь связать свойство ItemsSource объекта DataGridComboBoxColumn со свойством CLR «FieldTypes» в модели представления. «FieldTypes» - это список, который является производным от таблицы Linq to Sql типа FieldType. ItemsSource DataGrid из одной System.Data.Linq.Table, а FieldTypes из отдельной таблицы, и эти две таблицы не имеют никакой связи .

Чтобы связать FieldTypes DataGridComboBoxColumn со свойством «FieldTypes» в модели представления, я создал DataTemplate StaticResource для использования в DataGridTemplateColumn:

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

Оказывается, этот DataTemplate будет работать с дочерним элементом главного окна НЕ в DataGrid, например, в HeaderedContentControl.ContentTemplate, но не будет работать в DataGridTemplateColumn.CellTemplate.

Если я попытаюсь связать DataGridComboBoxColumn со свойством ComboBox.ItemsSource обычного ComboBox, отсутствующего в DataGrid,

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

работает как положено, но не для ComboBox внутри DataGrid.

Мне бы хотелось иметь как можно больше привязки данных к свойствам модели представления, но это также выглядит как возможность для StaticResource. Однако этот StaticResource изменился бы после загрузки окна, так как строка соединения не известна до и после. Даже при привязке ItemsSource столбца ComboBox к StaticResource мне не повезло с этим или с DynamicResource.

Есть ли какой-нибудь способ выполнить это связывание столбца ComboBox DataGrid с коллекцией, отдельной от ItemsSource DataGrid, используя MVVM? Или есть способ сделать это с помощью StaticResource, даже если соединение SQL изменяется после загрузки окна?

1 Ответ

1 голос
/ 06 февраля 2010

Попробуйте заменить привязку ElementName следующим образом:

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

ElementName может разрешать имена только в определенной области, и, как правило, не рекомендуется использовать их внутри DataTemplate для ссылки на что-то внешнее (хотя в некоторых случаях это будет работать).

...