Pregunta

Estoy en el proceso de implimenting el patrón MVVC y estoy teniendo la unión de una propiedad en el modelo de vista desde el interior de un DataTemplate dentro de una cuadrícula de datos problemas. Si tengo un bloque de texto fuera de la DataTemplate en la columna funciona bien (ya que estoy referencia directa a la DataContext de la UserConrol, es decir, el VM) sin embargo desde dentro de la DataTemplate no lo puedo devolver la propiedad de texto sin formato. sin embargo, volverá una propiedad del objeto IEnumerable iterado.

<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 im haciendo caso omiso ?? Tenga en cuenta el "{Binding Path = DataContext.testText, ElementName = Ver}" que funciona para todos los elementos excepto el de la DataTemplate. (Nota Sé que la primera Textblock fuera el imposible de la DG necesita el ElementName, etc, pero yo acabamos de hecho de esta manera de demostrar a mí mismo que su referencia a lo correcto)

¿Fue útil?

Solución

No sé si esto se aplica a la sociedad, pero se puede comprobar esto:

"La colección de columnas es sólo una propiedad en la cuadrícula de datos;. Esta colección no está en el árbol lógico (o visual), por lo que el DataContext no se hereda, lo que lleva a que exista nada que se unen a"

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

Otros consejos

Puede seguir los datos se unen a los recursos estáticos dentro de sus DataTemplates incluso cuando los datos de elemento a elemento de enlace no funciona. Un método para vistas para hacer referencia al modelo de vista en el patrón MVVM está almacenando el modelo de vista en un recurso estático, tal como el ViewModelLocator utilizado por el MVVM Light Toolkit .

Asumiendo que su modelo de vista se llama TestViewModel, puedo modificar ejemplo XAML utilizar un 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>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top