WPF在后面的代码中更改ItemsPanel和ItemTemplate

时间:2010-04-10 15:08:20

标签: wpf itemtemplate itemspanel

我在XAML中有以下列表:

<ListView Name="ListViewBack"
          Margin="3"
          ScrollViewer.HorizontalScrollBarVisibility="Disabled"
          ItemsPanel="{StaticResource IconListPanelTemplate}"
          ItemTemplate="{StaticResource IconListDataTemplate}">
</ListView>

现在我希望能够将ItemsPanel和ItemTemplate从List更改为Grid版本。我已经尝试使用以下代码:

ListViewBack.ItemsPanel = Resources["IconGridPanelTemplate"] as ItemsPanelTemplate;
ListViewBack.ItemTemplate = Resources["IconGridDataTemplate"] as DataTemplate;

但是在被驱逐时没有任何反应。

有什么想法吗?

谢谢!

2 个答案:

答案 0 :(得分:3)

您明显的问题是您使用的是Resources[]而不是FindResource()。一般情况下,Resources[]仅在您的资源位于this.Resources字典中时才有效,而不在其他地方。

这就是我要重写两行代码的方法:

ListViewBack.ItemsPanel = (ItemsPanelTemplate)ListViewBack.FindResource("IconGridPanelTemplate");
ListViewBack.ItemTemplate = (DataTemplate)ListViewBack.FindResource("IconGridDataTemplate");

实际上,我更有可能使用触发器或使用DynamicResource和交换资源字典来达到这个目的,但这是另一个故事。

请注意,我拨打了ListViewBack.FindResource()而不是FindResource()。这是在UserControl级别下面的资源字典中重新定义IconGridPanelTemplate的情况。如果永远无法做到这一点,您只需致电FindResource()

答案 1 :(得分:0)

您需要设置ListView.View的样式,而不是ListView本身。 有关示例,请查看ViewBase Class的文档。