2009-07-06 33 views
5

Tôi đang trong quá trình implimenting mẫu MVVC và đang gặp khó khăn ràng buộc một tài sản trong viewmodel từ bên trong một DataTemplate trong một DataGrid. Nếu tôi có một textblock bên ngoài DataTemplate trong cột nó hoạt động tốt (vì tôi trực tiếp tham chiếu đến datacontext của UserConrol, tức là VM) tuy nhiên từ bên trong DataTemplate nó sẽ không trả về thuộc tính văn bản thuần túy. Tuy nhiên nó sẽ trả về một thuộc tính từ mục IEnumerable được lặp lại.Silverlight DataGrid.Celltemplate Binding để 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> 

Có một số vấn đề với DataTemplate mà tôi bỏ qua không ?? Lưu ý rằng "{Binding Path = DataContext.testText, ElementName = View}" hoạt động cho tất cả các phần tử ngoại trừ một phần tử trong DataTemplate. (Lưu ý tôi biết rằng Textblock 1 bên ngoài DG không cần ElementName vv nhưng tôi đã thực hiện nó theo cách này để chứng minh cho bản thân mình rằng nó tham chiếu đến điều đúng)

Trả lời

2

Tôi không biết nếu điều này áp dụng cho SL, nhưng bạn có thể kiểm tra điều này:

"Bộ sưu tập Cột chỉ là một thuộc tính trong Datagrid; bộ sưu tập này không phải là cây logic (hoặc trực quan), do đó DataContext không được kế thừa, dẫn đến không có gì để liên kết với. "

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

+1

Bài đăng của Jaime dành riêng cho WPF nhưng chắc chắn giải thích lý do tại sao tính năng này không hoạt động trong cả WPF và Silverlight. Tuy nhiên, cách giải quyết trong bài viết của Jaime sẽ không làm việc cho việc liên kết dữ liệu phần tử với phần tử để nó không giải quyết vấn đề này. –

1

Bạn vẫn có thể dữ liệu ràng buộc để các tài nguyên tĩnh bên DataTemplates của bạn ngay cả khi dữ liệu yếu tố-to-yếu tố ràng buộc không hoạt động. Một phương thức cho các khung nhìn để tham chiếu đến mô hình khung nhìn trong mẫu MVVM là lưu trữ mô hình khung nhìn trong một tài nguyên tĩnh, chẳng hạn như ViewModelLocator được sử dụng bởi MVVM Light Toolkit.

Giả sử mô hình chế độ xem của bạn có tên là TestViewModel, tôi có thể sửa đổi XAML mẫu của bạn để sử dụng một ViewModelLocator và kết thúc với điều này.

<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> 
Các vấn đề liên quan