2012-01-18 50 views
0

我在Silverlight中使用Prism 4,我想使用ItemsControl來託管多個視圖。我真的希望將所有視圖都包裝在指定的ItemTemplate中,或者能夠指定ItemStyle,以便我可以使用類似Silverlight Toolkit中的Expander控件的東西。當我嘗試指定ItemTemplate時,會在運行時引發未處理的System.NotSupportedException。是否有類似於TabControlRegionAdapter.ItemContainerStyle ItemsControl的附加屬性?

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> 
+0

你是如何設置的ItemsSource?基於異常,它聽起來像你顯式地將項目添加到項目控件(itemsControl.itemsControl.Items.Add()),而不是設置ItemsSource,通常通過綁定或您可以通過Codebehind(itemscontrol.ItemsSource =我的收藏)。 – 2012-01-22 09:32:54

+0

我沒有在Xaml中設置ItemsSource。我在Prism4中使用默認的ItemsControlRegionAdapter。它將void Adapt(IRegion region,ItemsControl regionTarget)中的ItemsSource設置爲:regionTarget.ItemsSource = region.Views。 region.Views是IViewsCollection:IEnumerable ,INotifyCollectionChanged。這裏沒有什麼太瘋狂的... – JJS 2012-01-23 18:39:07

+0

你知道收集什麼嗎?我認爲這可能是問題,因爲SL知道它已經是一個可能只是嘗試渲染它的元素,而不是將它用作DataTemplate的DataContext。 – 2012-01-26 12:28:43

回答

0

它已經有一段時間,因爲我用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(); 
    } 
} 

您引導剛註冊您的適配器

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

當然剩下的部分是實現控制'包裝',所以你可以創建該類並添加內容。它可能只是一個ContentControl,其風格類似於此示例中的特定風格,或添加任何更有趣的內容。

此代碼基於PRISM的舊版本,因此最近可能發生了變化。

希望這有助於

米格爾

+0

感謝您的答案@Miguel Madero。我會試試這個並回復你。 – JJS 2012-01-27 15:31:08