WPF изменяет ItemsPanel и ItemTemplate в коде позади

У меня есть следующий список в XAML:

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

Теперь я хотел бы иметь возможность изменить ItemsPanel и ItemTemplate из списка в версию с сеткой. Я пробовал это, используя следующий код:

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

Но при исключении ничего не происходит.

Любые идеи?

Спасибо!


person Tijs Hendriks    schedule 10.04.2010    source источник


Ответы (2)


Ваша очевидная проблема в том, что вы используете Resources[] вместо FindResource(). В общем, Resources[] будет работать, только если ваш ресурс находится в this.Resources словаре, а не где-либо еще.

Вот как я бы переписал ваши две строчки кода:

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

На самом деле я бы с большей вероятностью использовал для этой цели триггеры или DynamicResource и словари ресурсов обмена, но это уже другая история.

Обратите внимание, что я назвал ListViewBack.FindResource(), а не просто FindResource(). Это в случае, когда IconGridPanelTemplate переопределяется в словаре ресурсов ниже уровня UserControl. Если это никогда не станет возможным, вы можете просто позвонить FindResource().

person Ray Burns    schedule 11.04.2010

Вам нужно стилизовать свой ListView.View, а не сам ListView. См. Документацию для класса ViewBase для пример.

person majocha    schedule 12.04.2010