Параметры не передаются в SelectTemplate () пользовательского DataTemplateSelector.Зачем? - PullRequest
5 голосов
/ 24 ноября 2010

Я использую CellTemplateSelector для условного отображения галочки в столбце DataGrid.

Метод SelectTemplate(object item, DependencyObject container) моего DataTemplateSelector класса вызывается, но элемент параметра равен нулю вместо ожидаемого DataRowView -объекта.

Вот код XAML. Элементы в свойстве ItemsSource объекта DataGrid - это DataTable, который отлично работает для других столбцов. ( Я работаю с Visual Studio Express 2010 )

...
<Window.Resources>        
        <DataTemplate x:Key="CheckedTemplate">
            <Path Width="16" Height="16" Margin="6,0,0,0" 
            x:Name="CheckMark" SnapsToDevicePixels="False"
            Stroke="Green" Fill="Green" StrokeThickness="1"
            Data="M 12.4227,0.00012207C 12.4867,0.126587 12.5333,0.274536 
            12.6787,0.321411C 9.49199,3.24792 6.704,6.57336 
            4.69865,10.6827C 4.04399,11.08 3.47066,11.5573 2.83199,
            11.9706C 2.09467,10.2198 1.692,8.13196 3.8147e-006,
            7.33606C 0.500004,6.79871 1.31733,6.05994 1.93067,6.2428C 
            2.85999,6.51868 3.14,7.9054 3.60399,8.81604C 5.80133,
            5.5387 8.53734,2.19202 12.4227,0.00012207 Z " />
        </DataTemplate>
        <DataTemplate x:Key="UncheckedTemplate">
        </DataTemplate>

        <local:CheckmarkTemplateSelector x:Key="CheckmarkTemplateSelector"  CheckedTemplate="{StaticResource CheckedTemplate}" UncheckedTemplate="{StaticResource UncheckedTemplate}" />
    </Window.Resources>
...
<DataGrid ItemsSource="{Binding Items, Mode=OneWay}"  AutoGenerateColumns="False">            
    <DataGrid.Columns>
        <DataGridTextColumn Header="No" Binding="{Binding no}" IsReadOnly="True" />
        <DataGridTextColumn Header="Name" Binding="{Binding name}" IsReadOnly="True" />
        <DataGridTemplateColumn Header="Selected" CellTemplateSelector="{StaticResource CheckmarkTemplateSelector}" />
    </DataGrid.Columns>
</DataGrid>
...

Любая помощь приветствуется. Заранее спасибо.

1 Ответ

4 голосов
/ 24 ноября 2010

Вы уверены, что он всегда пропускается нулем или только в первый раз? CellTemplateSelector вызывается один раз с нулевым item при настройке логического дерева, затем вызывается один раз для каждого элемента данных, когда item передал связанный объект. Вы можете просто потерпеть неудачу на первом нуле.

См. Также этот вопрос: Почему метод SelectTemplate запускается 2 раза в режиме отладки?

...