从数据网格中的组合框绑定到页面datacontext

时间:2009-10-20 00:05:44

标签: silverlight

我有一个带有视图模型的页面。我正在尝试将模板框的绑定源从模板化DataGrid列设置为视图模型。它给了我一个空的引用错误。

这是我的XAML:

<navigation:Page.Resources>
    <vm:SiteViewModel x:Key="viewModel" />
</navigation:Page.Resources>
<navigation:Page.DataContext>       
    <Binding Source="{StaticResource viewModel}" />
</navigation:Page.DataContext>

...

<data:DataGrid ItemsSource="{Binding CurrentSite.Contacts}"> 
    <data:DataGrid.Columns>
    <data:DataGridTemplateColumn Header="Role">
                            <data:DataGridTemplateColumn.CellTemplate>
                                <DataTemplate>                                
                                    <ComboBox ItemsSource="{Binding Path=Roles, Source=????}"  >
                                        <ComboBox.ItemTemplate>
                                            <DataTemplate>
                                                <StackPanel Orientation="Horizontal">
                                                    <TextBlock Text="{Binding Path=RoleName}" VerticalAlignment="Center" />
                                                </StackPanel>
                                            </DataTemplate>
                                        </ComboBox.ItemTemplate>
                                    </ComboBox>
                                </DataTemplate>
                            </data:DataGridTemplateColumn.CellTemplate>
                        </data:DataGridTemplateColumn>
    </data:DataGrid.Columns>
</data:DataGrid>

1 个答案:

答案 0 :(得分:0)

首先,您可以将xaml简化为:

<navigation:Page.DataContex>
  <vm:SiteViewModel />
</navigation:Page.DataContext>

另一个问题是,一旦你进入具有不同datacontext的数据网格,你就无法再回到页面datacontext。为了解决这个问题,我建议使用Dan Wahlin's DataContextProxy control,这样可以轻松退出。使用它你会添加:

<navigation:Page.DataContex>
  <vm:SiteViewModel />
</navigation:Page.DataContext>
<navigation:Page.Resources>    
 <controls:DataContextProxy x:Key="DataContextProxy" />
</navigation:Page.Resources>

...

<data:DataGrid ItemsSource="{Binding CurrentSite.Contacts}">     
 <data:DataGrid.Columns>    
  <data:DataGridTemplateColumn Header="Role">                            
   <data:DataGridTemplateColumn.CellTemplate>                                
    <DataTemplate>                                                                    
      <ComboBox ItemsSource="{Binding Source={StaticResource DataContextProxy},Path=DataSource.Roles}">
...
      </ComboBox>                                
    </DataTemplate>                            
   </data:DataGridTemplateColumn.CellTemplate>                        
  </data:DataGridTemplateColumn>    
 </data:DataGrid.Columns>
</data:DataGrid>