2009-07-06 23 views
5

MVVC şablonunu özümseme sürecindeyim ve bir datagrid içinde bir DataTemplate içinden bir viewmodel özelliği bağlamada sorun yaşıyorum. DataTemplate dışında bir metin bloğum varsa, o da iyi çalışır (ben doğrudan UserConrol, yani VM) veri bağlamı başvuruyor, ancak DataTemplate içinden düz metin özelliğini döndürmez. Ancak yinelenen IEnumerable öğeden bir özellik döndürecektir.Silverlight DataGrid.Celltemplate ViewModel ile Bağlama

<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 ile görmezden gelen bir çeşit sorun var mı? "{Binding Path = DataContext.testText, ElementName = View}", DataTemplate'dekiler dışındaki tüm öğeler için çalışır. (Not: DG'nin dışındaki 1. Textblock'un, ElementName'a ihtiyaç duymadığını biliyorum ama ben kendim için doğru şeyi referans gösterdiğimi ispatladım.)

cevap

2

Bunun SL için geçerli olup olmadığını bilmiyorum, ama bunu kontrol edebilirsiniz:

"Sütunlar koleksiyonu Datagrid'teki bir özelliktir, bu koleksiyon mantıksal (veya görsel) bir ağaçta değildir, bu nedenle DataContext öğesinin devralınması mümkün değildir. bağlamak için.

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

+1

Jaime'nin postası WPF'ye özgüdür, ancak bunun neden WPF ve Silverlight'ta işe yaramadığını kesinlikle açıklar. Bununla birlikte, Jaime'nin gönderisindeki geçici çözüm, öğe-öğe veri bağlama için çalışmaz, bu nedenle bu sorunu çözmez. –

1

Hala DataTemplates içindeki statik kaynaklara veri bağlama elemanı-to-eleman veri bağlama çalışmıyor olabilir bile. MVVM modelindeki görünüm modeline başvurmak için görünümlerden biri, görünüm modelini MVVM Light Toolkit tarafından kullanılan ViewModelLocator gibi statik bir kaynağa depolamaktır.

Görünüm modelinizin TestViewModel adlı olduğunu varsayarak, bir ViewModelLocator kullanmak için örnek XAML'nizi değiştirebilir ve bununla bitebilirim.

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