findResource() не работает с DataTemplate
Я определил DataTemplate следующим образом:
<s:SurfaceWindow.Resources>
<ImageBrush x:Key="WindowBackground" Stretch="None" Opacity="0.6" ImageSource="pack://application:,,,/Resources/WindowBackground.jpg"/>
<DataTemplate x:Key="ContainerItemTemplate">
<Grid>
<Border BorderThickness="1" BorderBrush="White" Margin="3">
<s:SurfaceTextBox IsReadOnly="True" Width="120" Text="{Binding Path=name}" Padding="3"/>
</Border>
<s:SurfaceButton Content="Expand" Click="SourceFilePressed"></s:SurfaceButton>
</Grid>
</DataTemplate>
</s:SurfaceWindow.Resources>
Затем я использовал его для добавления ItemTemplate в LibraryContainer:
<Grid Name="RootGrid" Background="{StaticResource WindowBackground}" >
<s:ScatterView Name="RootScatter">
<Viewbox>
<s:LibraryContainer Name="RootContainer" Grid.Row="0" ViewingMode="Bar">
<s:LibraryContainer.BarView>
<s:BarView Rows="2" NormalizedTransitionSize="2.5,0.8" ItemTemplate="{StaticResource ContainerItemTemplate}">
</s:BarView>
</s:LibraryContainer.BarView>
<s:LibraryContainer.StackView>
<s:StackView NormalizedTransitionSize="1,1" ItemTemplate="{StaticResource ContainerItemTemplate}">
</s:StackView>
</s:LibraryContainer.StackView>
</s:LibraryContainer>
</Viewbox>
</s:ScatterView>
</Grid>
Позже я добавляю новый ScatterViewItem в ScatterView:
ScatterViewItem item = new ScatterViewItem();
FrameworkElement element = surfaceWindow as FrameworkElement;
DataTemplate tmpl = element.FindResource("ContainerItemTemplate") as DataTemplate;
LibraryContainer container = new LibraryContainer();
container.ViewingMode = LibraryContainerViewingMode.Bar;
container.ItemsSource = itms;
container.BarView.ItemTemplate = tmpl;
item.Content = container;
surfaceWindow.getRootScatter().Items.Add(item);
К сожалению, я всегда получаю исключение NullReferenceException в строке:
container.BarView.ItemTemplate = tmpl;
Дополнительная информация:
Объект SurfaceWindow передается в этом методе. Это ссылка на файл, в котором я определил DataTemplate.
1 ответ
Если ваш конструктор для вашего объекта LibraryContainer не создаст объект LibraryContainer.BarView, в этот момент он будет нулевым.
Правка Хорошо, так что игнорируйте предыдущие попытки... Сейчас я немного больше изучил элементы управления поверхностью.
Возвращаясь к исходному методу извлечения шаблона данных с помощью ключа:
DataTemplate tmpl = element.FindResource("ContainerItemTemplate")
Если вы установили точку останова, был ли возвращен шаблон или он был нулевым в этой точке?