将Silverlight DataGrid.Celltemplate绑定到ViewModel
我正在实施MVVC模式,并且无法在数据网格的DataTemplate中绑定视图模型中的属性。 如果我在列的DataTemplate之外有一个textblock,它就可以正常工作(因为我直接引用UserConrol的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>
DataTemplate是否存在某种问题,我忽略了? 注意“{Binding Path = DataContext.testText,ElementName = View}”适用于除DataTemplate中的所有元素外的所有元素。 (注意,我知道DG之外的第一个Textblock不需要ElementName等,但我刚刚通过这种方式来证明自己的参考是正确的)
我不知道这是否适用于SL,但你可以检查一下:
“Columns集合只是Datagrid中的一个属性;这个集合不在逻辑(或可视化)树中,因此DataContext没有被继承,导致没有任何东西可以绑定到它。”
http://blogs.msdn.com/jaimer/archive/2008/11/22/forwarding-the-datagrid-s-datacontext-to-its-columns.aspx
即使元素到元素的数据绑定不起作用,您仍然可以将数据绑定到DataTemplates中的静态资源。 视图在MVVM模式中引用视图模型的一种方法是将视图模型存储在静态资源中,例如MVVM Light Toolkit使用的ViewModelLocator。
假设您的视图模型名为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>
链接地址: http://www.djcxy.com/p/7755.html