したがって、複数のタイプのオブジェクトのコレクションがあります。たとえば、Bの基本クラスと、子孫C、D、Eです。
これはすべて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。私はMVVMLightを使用しているので、コードビハインドファイルの使用は避けたいと思います。
LE:
これは機能しているようですが、何らかの理由でVisualStudioIntellisenseはそれについて認識していません。ランタイムは問題ないようですが、設計時には何もありません。アイデアはありますか、これをすべて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>(); }
}
ありがとう、