代码之家  ›  专栏  ›  技术社区  ›  Rob

Silverlight DataGrid.CellTemplate绑定到ViewModel

  •  5
  • Rob  · 技术社区  · 17 年前

    我正在实施MVVC模式,并且在从DataGrid中的DataTemplate绑定ViewModel中的属性时遇到问题。如果列中的DataTemplate外有一个TextBlock,它可以正常工作(因为我直接引用UserControl的DataContext,即VM),但是从DataTemplate内它不会返回纯文本属性。但是,它将从迭代的IEnumerable项返回属性。

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

    我忽略的数据模板有什么问题吗??注意“binding path=dataContext.testtext,elementname=view”适用于除数据模板中的元素以外的所有元素。(注意,我知道DG之外的第一个文本块不需要元素名等,但我刚刚这样做是为了向自己证明它引用了正确的东西)

    2 回复  |  直到 17 年前
        1
  •  2
  •   gschuager    16 年前

    我不知道这是否适用于SL,但您可以查看:

    columns集合只是DataGrid中的一个属性;此集合不在逻辑(或可视)树中,因此未继承DataContext,这导致没有可绑定的内容。

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

        2
  •  1
  •   Matt Casto    16 年前

    即使元素到元素的数据绑定不起作用,您仍然可以将数据绑定到数据模板内的静态资源。视图引用MVVM模式中视图模型的一种方法是将视图模型存储在静态资源中,例如 MVVM Light Toolkit .

    假设您的视图模型名为testviewmodel,我可以修改示例xaml以使用viewmodellocator并以此结束。

    <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>
    
    推荐文章