Есть ли что-то похожее на вложенное свойство TabControlRegionAdapter.ItemContainerStyle для ItemsControl? - PullRequest
0 голосов
/ 18 января 2012

Я использую Prism 4 с Silverlight и хочу использовать ItemsControl для размещения нескольких представлений.Я действительно хочу, чтобы все представления были обернуты внутри указанного ItemTemplate или чтобы можно было указать ItemStyle, чтобы я мог использовать что-то вроде элемента управления Expander в Silverlight Toolkit .Когда я пытаюсь указать ItemTemplate, необработанное исключение System.NotSupportedException генерируется во время выполнения.

ItemsControl.Items must not be a UIElement type when an ItemTemplate is set.
   at System.Windows.Controls.ItemsControl.MS.Internal.Controls.IGeneratorHost.GetContainerForItem(Object item, DependencyObject recycledContainer)
   at System.Windows.Controls.ItemContainerGenerator.Generator.GenerateNext(Boolean stopAtRealized, Boolean& isNewlyRealized)
   at System.Windows.Controls.ItemContainerGenerator.System.Windows.Controls.Primitives.IItemContainerGenerator.GenerateNext(Boolean& isNewlyRealized)
   at System.Windows.Controls.ItemsControl.AddContainers()
   at System.Windows.Controls.ItemsControl.RecreateVisualChildren(IntPtr unmanagedObj)

Код

<ItemsControl Regions:RegionManager.RegionName="DetailsRegion">
     <ItemsControl.ItemTemplate>
        <DataTemplate>
           <Border BorderBrush="Red" BorderThickness="1">
              <ContentPresenter Content="{Binding}"/>
           </Border>
        </DataTemplate>
     </ItemsControl.ItemTemplate>
  </ItemsControl>

1 Ответ

0 голосов
/ 27 января 2012

Прошло много времени с тех пор, как я использовал PRISM, но ниже приведен пример, который можно использовать для реализации пользовательского IRegion, который оборачивает элемент перед добавлением его в коллекцию.

public class RegionWrapper : Region
{
    public override Microsoft.Practices.Composite.Regions.IRegionManager Add(object view, string viewName, bool createRegionManagerScope)
    {
        var myWrapper = new Wrapper();
        myWrapper.Content = view;
        return base.Add(myWrapper, viewName, createRegionManagerScope);
    }
}

Для регистрацииЭтот элемент вам нужен для создания фабрики регионов, которую в PRISM они называют адаптером

public class RegionWrapperAdapter : RegionAdapterBase<IRegionAdapter>
{
    protected override Microsoft.Practices.Composite.Regions.IRegion CreateRegion()
    {
        return new RegionWrapper();
    }
}

. Затем на вашей Bootstrap просто зарегистрируйте свой адаптер

    protected override RegionAdapterMappings ConfigureRegionAdapterMappings()
    {
        var regionAdapterMappings = base.ConfigureRegionAdapterMappings();
        regionAdapterMappings.RegisterMapping(typeof(ItemsControl), Container.Resolve<RegionWrapperAdapter>());
        return regionAdapterMappings;
    }

Конечно, другая часть слевареализовать элемент управления «Обертка», чтобы вы могли создать этот класс и добавить содержимое.Это может быть просто ContentControl с определенным стилем, похожим на тот, что у вас есть в этом примере, или добавить что-нибудь более причудливое.

Этот код основан на старой версии PRISM, поэтому в последнее время все могло измениться.

Надеюсь, это поможет

Мигель

...