如何在Expression Blend中使用CollectionViewSource和设计时数据?

时间:2012-06-17 14:44:50

标签: wpf windows-phone-7

我想知道如何使用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?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

如果您想在设计器中显示示例数据,我建议您从代码中执行此操作。有两种方法可以为Blend Designer或VStudio设计器生成样本数据:

  1. 像你一样从XML文件。
  2. 来自 c#c​​lass - &gt;最佳选择
  3. 最佳选择。

    在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的集合。