2009-07-06 8 views
5

MVVC 패턴을 구현하는 중입니다. DataGrid 내의 DataTemplate 내에서 viewmodel의 속성을 바인딩하는 데 문제가 있습니다. 열의 DataTemplate 외부에 텍스트 블록이있는 경우 DataTemplate 내에서 일반 텍스트 속성을 반환하지 않으므로 잘 작동합니다 (즉, UserConrol, 즉 VM의 datacontext를 직접 참조하기 때문에). 그러나 iterated IEnumerable 항목에서 속성을 반환합니다.Silverlight DataGrid.Celltemplate 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> 

DataTemplate에 문제가 있습니까? "{Binding Path = DataContext.testText, ElementName = View}"은 DataTemplate에있는 요소를 제외한 모든 요소에서 작동합니다. (DG 밖에있는 첫 번째 Textblock이 ElementName 등을 필요로하지 않는다는 사실을 알고 있습니다.하지만이 방법을 통해 자신에게 옳은 것을 나타냄을 증명합니다.)

답변

2

SL에 적용되는지, 그러나 이것을 확인할 수 있습니다 :

"Columns 컬렉션은 Datagrid의 속성 일 뿐이며,이 컬렉션은 논리적 (또는 시각적) 트리가 아니므로 DataContext가 상속되지 않으므로 아무것도 존재하지 않습니다 에 바인딩합니다. "

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

+1

Jaime의 게시물은 WPF에만 해당하지만 WPF와 Silverlight에서 모두 작동하지 않는 이유는 분명합니다. 그러나 Jaime의 게시물의 해결 방법은 요소 간 데이터 바인딩에서 작동하지 않으므로이 문제는 해결되지 않습니다. –

1

당신은 여전히 ​​당신의 DataTemplates 내부 정적 자원에 대한 데이터 바인딩은 요소 간 요소 데이터 바인딩이 작동하지 않을 수 있습니다 경우에도. MVVM 패턴에서 뷰 모델을 참조하는 뷰의 한 가지 방법은 뷰 모델을 MVVM Light Toolkit에서 사용하는 ViewModelLocator와 같은 정적 리소스에 저장하는 것입니다.

뷰 모델의 이름이 TestViewModel이라고 가정하면 ViewModelLocator를 사용하고 XAML 예제를 수정하여 끝낼 수 있습니다.

<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>