2012-08-14 43 views
1

所以我有一個可能是多種類型的對象的集合。 例如一個帶B的基類,以及後代C,D,E。Silverlight 5隱式數據模板和ContentPresenter綁定MVVM

所有這些都將在ItemsControl中,但是使用自定義(某種隨機)邏輯。因此,我在XAML中創建一個ItemsControl,指定DataTemplates將它們綁定到類型,並讓Silverlight隱式數據模板引擎處理其餘部分。

ItemsControl演示器中元素的位置在某種程度上是隨機的,並且僅在運行時作爲元素本身(Base類的一部分)中的依賴項屬性可用。

我的問題是默認情況下,ItemsControl將項目包裝在ContentPresenter對象中,因此在數據模板中設置Canvas.Left和Canvas.Top沒有任何效果。因爲這應該在ContentPresenter級別上進行設置。但是,如果我定義ContentPresenter樣式,則其數據源是ItemsControl本身,而不是項目。因此,我不能以這種方式約束物品的位置。

任何想法,我如何將項目位置屬性綁定到ContentPresenters的Canvas.Left屬性?

在代碼術語:

<ItemsControl HorizontalAlignment="Stretch" Grid.Row="0" Grid.ColumnSpan="3" 
        x:Name="CardItems" ItemsSource="{Binding CardList}" ScrollViewer.HorizontalScrollBarVisibility="Disabled" 
        ScrollViewer.VerticalScrollBarVisibility="Disabled"> 
     <i:Interaction.Triggers> 
      <i:EventTrigger EventName="SizeChanged"> 
       <ei:CallMethodAction MethodName="WndSizeChanged" TargetObject="{Binding}" /> 
      </i:EventTrigger> 
     </i:Interaction.Triggers> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <Canvas/> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
    </ItemsControl> 
<UserControl.Resources> 
    <DataTemplate DataType="Card:AdCardViewModel"> 
     <Canvas d:DesignHeight="300" d:DesignWidth="150" Width="{Binding CardSize.Width}" Height="{Binding CardSize.Height}" Background="Red"> 
      <Canvas.Projection> 
       <PlaneProjection RotationY="{Binding Path=Rotation}"/> 
      </Canvas.Projection> 
      <Viewbox> 
       <StackPanel> 
        <StackPanel.Background> 
         <SolidColorBrush Color="{StaticResource OriginalRecommendationColor}"/> 
        </StackPanel.Background> 
        <TextBlock Text="{Binding AdCard}" Foreground="CadetBlue"/> 
       </StackPanel> 
      </Viewbox> 
     </Canvas> 
    </DataTemplate> 
</UserControl.Resources> 

PS。我正在使用MVVM Light,所以我寧願避免使用文件後面的代碼。

LE:

這似乎是工作,但由於某種原因在Visual Studio智能感知還沒有關於它的想法。運行時似乎沒問題,但是在設計時沒有任何問題。任何想法,如何使這一切都在Blend工作?

  <ItemsControl.Resources> 
      <Style TargetType="ContentPresenter"> 
       <Setter Property="Canvas.Left" Value="{Binding Path=Position.Height}"/> 
       <Setter Property="Canvas.Top" Value="{Binding Path=Position.Width}"/> 
       <Setter Property="Width" Value="Auto"/> 
       <Setter Property="Height" Value="Auto"/> 
       <Setter Property="HorizontalAlignment" Value="Stretch"/> 
       <Setter Property="VerticalAlignment" Value="Stretch"/> 
      </Style> 
     </ItemsControl.Resources> 

的viewModelLocator:

static ViewModelLocator() 
    { 
     ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default); 

     // Step #1 - Register the data providing services, design and runtime versions 
     if (ViewModelBase.IsInDesignModeStatic) 
     { 
      SimpleIoc.Default.Register<ICardService, DesignCardService>(); 
     } 
     else 
     { 

      SimpleIoc.Default.Register<ICardService, CardService>(); 

     } 

     // Step#2 Register the ViewModels 
     SimpleIoc.Default.Register<CardSlideShowViewModel>(); 
    } 


    /// <summary> 
    ///  Gets the Video property. 
    /// </summary> 
    [SuppressMessage("Microsoft.Performance", 
     "CA1822:MarkMembersAsStatic", 
     Justification = "This non-static member is needed for data binding purposes.")] 
    public CardSlideShowViewModel CardSlideShowSlideShow 
    { 
     get { return ServiceLocator.Current.GetInstance<CardSlideShowViewModel>(); } 
    } 

感謝,

回答

0

嘛,不是一個真正的答案,不過最近我來到這。在我看來,VS 2010並不支持這一點。然而,它在VS 2012中工作。所以如果你可以做升級。

0

設計時視圖模型應該做的伎倆。 您只需要創建運行時vm的簡單表示 - 在其構造函數中初始化CardViewModel集合。

然後綁定視圖模型在設計時是這樣的:

<UserControl x:Class="MyView" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     d:DataContext="{d:DesignInstance local:MyViewModel, 
              IsDesignTimeCreatable=True}" 
+0

那麼,我已經有了使用MVVM Light的ViewModelLocator IOC的設計數據。但是,在上面的例子中,這不起作用。任何想法,爲什麼? – Yeti 2012-08-15 11:24:58

+0

這將有助於瞭解如何爲CardList集合實現ViewModelLocator和setter。 – 2012-08-15 17:52:10

+0

基本的東西。 :)在混合它的作品,但不是在Visual Studio中。 – Yeti 2012-08-15 21:10:33