4

我想知道如何使用 CollectionViewSource 在位于 SampleData.xaml 内的 Expression Blend 中显示设计时数据?在更改我的代码以使用 CVS 之前,我使用了 ObservableCollection。我需要对里面的项目进行过滤和排序,因此我更改了代码以使用 CVS。现在我的设计师抱怨无法用适当的结构填充 SampleData 的 NextItems 以显示在 Expression Blend 中。这是我在应用程序中使用的一些代码:

主视图模型.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>

样本数据.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?任何帮助将非常感激。

4

1 回答 1

1

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

  1. 像你一样从一个 XML 文件。
  2. 来自c# 类-> 最佳选择

最佳选择。

在 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 中,您唯一需要做的就是将您的Listbox绑定到您的 ViewModel 的集合。

于 2013-09-10T18:45:22.277 回答