我想知道如何使用CollectionViewSource在Expression Blend中显示位于SampleData.xaml内的设计时数据?在更改我的代码以使用CVS之前,我使用了一个ObservableCollection。我需要对其中的项进行过滤和排序,因此我更改了代码以使用CVS。现在,我的设计师抱怨无法使用适当的结构填充SampleData的NextItems以显示在Expression Blend中。以下是我在应用程序中使用的一些代码:
MainViewModel.cs
class MainViewModel
{
public MainViewModel()
{
AllItems = new ObservableCollection<ItemViewModel>();
NextItems = new CollectionViewSource();
NextItems.Source = AllItems;
}
public CollectionViewSource NextItems
{
get;
private set;
}
public ObservableCollection<ItemViewModel> AllItems
{
get;
private set;
}
some functions to fill, filter, sort etc...
}
MainView.xaml:
<phone:PhoneApplicationPage
... some other stuff ...
d:DesignWidth="480"
d:DesignHeight="728"
d:DataContext="{d:DesignData SampleData/SampleData.xaml}">
<Grid
x:Name="LayoutRoot"
Background="Transparent">
<controls:Panorama>
<controls:PanoramaItem>
<ListBox ItemsSource="{Binding NextItems.View}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<Image Source="{Binding Image}" />
<StackPanel>
<TextBlock Text="{Binding FullName}" />
</StackPanel>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</controls:PanoramaItem>
</controls:Panorama>
</Grid>
</phone:PhoneApplicationPage>
SampleData.xaml
<local:MainViewModel
xmlns:local="clr-namespace:MyAppNamespace"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:swd="clr-namespace:System.Windows.Data;assembly=System.Windows" >
<local:MainViewModel.AllItems>
<local:ItemModel
FullName="Dummy"
Image="/Images/dummy.png" />
</local:MainViewModel.AllItems>
<local:MainViewModel.NextItems>
How to fill the CollectionViewSource's Source?
</local:MainViewModel.NextItems>
</local:MainViewModel>
所以我无法找到答案的问题是如何在SampleDate.xaml中填充NextItems的Source?任何帮助将不胜感激。
答案 0 :(得分:1)
如果您想在设计器中显示示例数据,我建议您从代码中执行此操作。有两种方法可以为Blend Designer或VStudio设计器生成样本数据:
最佳选择。
在WPF中,在Windows 8以及WP7.5和更高版本中,您可以访问一个名为Windows.ApplicationModel.DesignMode.DesignModeEnabled
的属性,利用它可以从视图模型中为您的ObservableCollection提供种子:
public class MainViewModel
{
public MainViewModel()
{
AllItems = new ObservableCollection<ItemViewModel>();
if (DesignMode.DesignModeEnabled)
{
AllItems = FakeDataProvider.FakeDataItems;
}
NextItems.Source = AllItems;
}
public CollectionViewSource NextItems
{
get;
private set;
}
public ObservableCollection<ItemViewModel> AllItems
{
get;
private set;
}
}
通过这种方式,如果您更改模型,则不必重新生成XML文件,从C#文件中可以更清晰一些。 FakeDataProvider是一个静态类,其中存储了所有设计时伪造数据。因此,在您的XAML中,您唯一需要做的就是将列表框绑定到ViewModel的集合。