Silverlight 数据表格.Celltemplate 绑定到视图模型

5

我正在实现MVVC模式,并且在datagrid中的DataTemplate中绑定viewmodel中的属性时遇到了问题。如果我在列外部有一个textblock,它可以正常工作(因为我直接引用了UserConrol的数据上下文即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等,但我只是这样做来证明它正在引用正确的内容)

2个回答

2

1
Jaime的帖子是关于WPF的,但绝对解释了为什么在WPF和Silverlight中都不起作用。然而,在Jaime的帖子中提到的解决方法对于元素到元素的数据绑定是行不通的,因此它并没有解决这个问题。 - Matt Casto

1

即使元素与元素之间的数据绑定不起作用,您仍然可以将静态资源绑定到 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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接