2009-07-06 11 views
5

Estoy en el proceso de implimentar el patrón MVVC y tengo problemas para vincular una propiedad en el modelo de vista desde dentro de una DataTemplate dentro de una cuadrícula de datos. Si tengo un bloque de texto fuera de DataTemplate en la columna, funciona bien (ya que me estoy refiriendo directamente al contexto de datos de UserConrol, es decir, la máquina virtual), pero desde dentro de DataTemplate no devolverá la propiedad de texto sin formato. Sin embargo, devolverá una propiedad del elemento IEnumerable iterado.Silverlight DataGrid.Celltemplate Enlace a ViewModel

<UserControl xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data" 
    x:Class="Timesheet.Silverlight.Modules.Views.HistoryView" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
    xmlns:Commands="clr-namespace:Microsoft.Practices.Composite.Presentation.Commands;assembly=Microsoft.Practices.Composite.Presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:ViewModels="clr-namespace:Timesheet.Silverlight.Modules.ViewModels" 
    x:Name="View"> 
    <StackPanel>    
    <TextBlock Text="{Binding Path=DataContext.testText, ElementName=View}" />  
      <data:DataGrid Height="280" Width="500" ItemsSource="{Binding TimeSlots}" AutoGenerateColumns="False" >       
      <data:DataGrid.Columns> 
       <data:DataGridTextColumn Header="Allocation Area" Binding="{Binding TimeAllocationArea.TimeAllocationName}" Width="200" /> 
       <data:DataGridTextColumn Header="Start" Binding="{Binding StartTime}" Width="80" /> 
       <data:DataGridTextColumn Header="End" Binding="{Binding Path=DataContext.testText, ElementName=View}" Width="80" /> 
       <data:DataGridTemplateColumn Header="Modify" Width="200" > 
        <data:DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <StackPanel Orientation="Horizontal"> 
           <TextBlock Text="{Binding Path=DataContext.testText, ElementName=View}" /> 
          </StackPanel> 
         </DataTemplate> 
        </data:DataGridTemplateColumn.CellTemplate> 
       </data:DataGridTemplateColumn> 
      </data:DataGrid.Columns> 
     </data:DataGrid>  
    </StackPanel> 
</UserControl> 

¿Hay algún tipo de problema con el DataTemplate que estoy ignorando? Tenga en cuenta que "{Binding Path = DataContext.testText, ElementName = View}" funciona para todos los elementos excepto el de DataTemplate. (Nota Sé que el primer Textblock fuera de la DG no necesita el ElementName, etc., pero lo he hecho de esta manera para probarme a mí mismo que está haciendo referencia a lo correcto)

Respuesta

2

No sé si esto se aplica a SL, pero puede verificar esto:

"La colección Columns es solo una propiedad en la cuadrícula de datos; esta colección no está en el árbol lógico (o visual), por lo tanto el DataContext no se hereda, lo que lleva a que no haya nada para unirse a ".

http://blogs.msdn.com/jaimer/archive/2008/11/22/forwarding-the-datagrid-s-datacontext-to-its-columns.aspx

+1

La publicación de Jaime es específica de WPF, pero definitivamente explica por qué esto no funciona tanto en WPF como en Silverlight. Sin embargo, la solución en la publicación de Jaime no funcionará para el enlace de datos de elemento a elemento, por lo que no resuelve este problema. –

1

Puede todavía los datos se unen a los recursos estáticos dentro de sus DataTemplates incluso cuando la unión no funciona de datos de elemento a elemento. Un método para que las vistas hagan referencia al modelo de vista en el patrón MVVM es almacenar el modelo de vista en un recurso estático, como el ViewModelLocator utilizado por el MVVM Light Toolkit.

Suponiendo que su modelo de vista se llame TestViewModel, puedo modificar su XAML de ejemplo para usar ViewModelLocator y terminar con esto.

<UserControl xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data" 
    x:Class="Timesheet.Silverlight.Modules.Views.HistoryView" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
    xmlns:Commands="clr-namespace:Microsoft.Practices.Composite.Presentation.Commands;assembly=Microsoft.Practices.Composite.Presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:ViewModels="clr-namespace:Timesheet.Silverlight.Modules.ViewModels" 
    x:Name="View" 
    DataContext="{Binding TestViewModel, Source={StaticResource Locator}}" 
    > 
    <StackPanel>    
     <TextBlock Text="{Binding Path=DataContext.testText, ElementName=View}" />  
     <data:DataGrid Height="280" Width="500" ItemsSource="{Binding TimeSlots}" AutoGenerateColumns="False" >       
      <data:DataGrid.Columns> 
       <data:DataGridTextColumn Header="Allocation Area" Binding="{Binding TimeAllocationArea.TimeAllocationName}" Width="200" /> 
       <data:DataGridTextColumn Header="Start" Binding="{Binding StartTime}" Width="80" /> 
       <data:DataGridTextColumn Header="End" Binding="{Binding Path=DataContext.testText, ElementName=View}" Width="80" /> 
       <data:DataGridTemplateColumn Header="Modify" Width="200" > 
        <data:DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <StackPanel Orientation="Horizontal"> 
           <!--<TextBlock Text="{Binding Path=DataContext.testText, ElementName=View}" />--> 
           <TextBlock Text="{Binding Source={StaticResource Locator}, Path=TestViewModel.testText}" /> 
          </StackPanel> 
         </DataTemplate> 
        </data:DataGridTemplateColumn.CellTemplate> 
       </data:DataGridTemplateColumn> 
      </data:DataGrid.Columns> 
     </data:DataGrid>  
    </StackPanel> 
</UserControl> 
Cuestiones relacionadas