1

したがって、複数のタイプのオブジェクトのコレクションがあります。たとえば、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>(); }
    }

ありがとう、

4

2 に答える 2

0

まあ、実際には答えではありませんが、私がこれに最も近いのです。VS2010はまだこれをサポートしていないようです。ただし、VS 2012では機能します。したがって、アップグレードを実行できる場合。

于 2012-09-03T22:12:47.023 に答える
0

デザインタイムビューモデルでうまくいくはずです。ランタイムvmの単純な表現を作成する必要があります-そのコンストラクターでCardViewModelコレクションを初期化します。

次に、次のように設計時にViewModelをバインドします。

<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}"
于 2012-08-15T06:33:50.990 に答える