07 июл. 2009 г., 01:20 отRob

Silverlight DataGrid.Celltemplate Привязка к ViewModel

Я нахожусь в процессе реализации шаблона MVVC, и у меня возникают проблемы с привязкой свойства в viewmodel из DataTemplate в сетке данных. Если у меня есть текстовый блок вне DataTemplate в столбце, он работает нормально (так как я непосредственно ссылаюсь на текстовый текст UserConrol, то есть на виртуальную машину), однако из 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, которую я игнорирую? Обратите внимание на & quot; {Binding Path = DataContext.testText, ElementName = View} & quot; работает для всех элементов, кроме одного в DataTemplate. (Обратите внимание, я знаю, что 1-й текстовый блок вне DG не нуждается в ElementName и т. Д., Но я только что сделал это таким образом, чтобы доказать себе, что он ссылается на правильную вещь)

Ответы на вопрос(2)

15 июл. 2010 г., 19:02 отMatt Casto

ваших шаблонов данных, даже если привязка данных между элементами не работает. Один из способов, позволяющих представлениям ссылаться на модель представления в шаблоне MVVM, заключается в сохранении модели представления в статическом ресурсе, таком как ViewModelLocator, используемый 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>
29 окт. 2009 г., 20:14 отgschuager

"Коллекция Columns - это просто свойство в Datagrid; эта коллекция не находится в логическом (или визуальном) дереве, поэтому DataContext не наследуется, что приводит к тому, что не с чем связываться."

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

ВАШ ОТВЕТ НА ВОПРОС