所以我有一個可能是多種類型的對象的集合。 例如一個帶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>(); }
}
感謝,
那麼,我已經有了使用MVVM Light的ViewModelLocator IOC的設計數據。但是,在上面的例子中,這不起作用。任何想法,爲什麼? – Yeti 2012-08-15 11:24:58
這將有助於瞭解如何爲CardList集合實現ViewModelLocator和setter。 – 2012-08-15 17:52:10
基本的東西。 :)在混合它的作品,但不是在Visual Studio中。 – Yeti 2012-08-15 21:10:33