2010-02-04 41 views
0

我是MVVM的初学者。主窗口使用WPF Toolkit中的库存DataGrid。它具有一个View Model,并仅依赖于.xaml.cs文件中的DataContext_Changed事件处理程序。主窗口的DataContext是View Model。窗口加载和连接更改后,将WPF Toolkit DataGrid ComboBox列绑定到Linq-to-Sql集合?

我试图将DataGridComboBoxColumn的ItemsSource属性绑定到视图模型上的CLR属性“FieldTypes”。 “FieldTypes”是一个从FieldType类型的Linq到Sql表派生的List。 DataGrid的ItemsSource来自一个System.Data.Linq.Table,而“FieldTypes”来自单独的表,而这两个表有没有关系

要绑定域类型DataGridComboBoxColumn对视图模型的“域类型”属性,我创建了一个DataGridTemplateColumn使用一个DataTemplate的StaticResource:

<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的不DataGrid中ComboBox.ItemsSource财产,

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

它能正常工作,但不适合在数据网格中组合框。

我想尽可能多地在视图模型的属性上绑定数据,但这看起来也是一个StaticResource的机会。然而,在窗口加载之后,这个StaticResource会改变,因为连接字符串直到后面才知道。即使在将ComboBox列的ItemsSource绑定到StaticResource时,我也没有运气或者DynamicResource。

是否有某种方法使用MVVM来完成DataGrid组合框列与DataGrid的ItemsSource之间的集合的绑定?或者是否有一种方法可以通过StaticResource完成此操作,即使窗口加载后SQL连接发生更改?

回答

1

尝试更换的ElementName与此绑定:

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

的ElementName只能在一定范围内解决的名字,它通常不是一个好主意,用他们的DataTemplate内指外在的东西(虽然会在某些情况下工作)。

+0

工作。我没有意识到ElementName的问题。我也看了南斯里奇的例子 (http://blogs.msdn.com/jaimer/archive/2009/02/10/mv-vm-training-day-sample-application-and-decks.aspx) 其中在名为“间谍”的Grid.Resources中使用了一个StaticResource,它似乎起作用。 – 2010-02-08 19:01:22