Silverlight 5隐式数据模板和ContentPresenter绑定MVVM
所以我有一个对象集合,可能有多种类型。 例如,带有B的基类和C、D、E的后代 所有这些都将在ItemsControl中,但是使用自定义的随机逻辑。因此,我在XAML中创建了一个ItemsControl,指定将它们绑定到类型的DataTemplates,并让Silverlight隐式datatemplate引擎处理其余部分 ItemsControl presenter中元素的位置在某种程度上是随机的,仅在运行时作为基类中元素本身的一部分的依赖属性可用 我的问题是默认情况下ItemsControl将项目包装在ContentPresenter对象中,因此在数据模板中设置Canvas.Left和Canvas.Top无效。因为这应该改为在ContentPresenter级别设置。但是,如果我定义ContentPresenter样式,则其数据源是ItemsControl本身,而不是items。因此,我无法以这种方式绑定项目的位置 有什么想法吗?我如何将item position属性绑定到ContentPresenters Canvas.Left属性 就守则而言:Silverlight 5隐式数据模板和ContentPresenter绑定MVVM,silverlight,data-binding,Silverlight,Data Binding,所以我有一个对象集合,可能有多种类型。 例如,带有B的基类和C、D、E的后代 所有这些都将在ItemsControl中,但是使用自定义的随机逻辑。因此,我在XAML中创建了一个ItemsControl,指定将它们绑定到类型的DataTemplates,并让Silverlight隐式datatemplate引擎处理其余部分 ItemsControl presenter中元素的位置在某种程度上是随机的,仅在运行时作为基类中元素本身的一部分的依赖属性可用 我的问题是默认情况下ItemsControl将
<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>
另外,我使用的是MVVM Light,所以我宁愿避免使用代码隐藏文件
乐:
这似乎是可行的,但由于某种原因,VisualStudioIntelliSense对此一无所知。运行时,它似乎是好的,但在设计时什么都没有。有什么想法吗,如何让所有这些都在混合中工作呢
<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>(); }
}
谢谢,设计时视图模型应该可以做到这一点。 您只需要创建运行时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}"
嗯,这不是一个真正的答案,不过我最接近这个。在我看来,VS2010还不支持这一点。然而,它在VS 2012中起作用。因此,如果您可以进行升级。那么,我已经通过使用MVVM灯光的ViewModelLocator IOC获得了设计数据。但是,在上面的示例中,由于某些原因,这不起作用。有什么想法吗?为什么?看看您是如何为CardList集合实现ViewModelLocator和setter的。基本资料:在Blend中它可以工作,但在VisualStudio中不能。