使用d:DesignInstance和CollectionViewSource

时间:2015-08-02 18:58:24

标签: c# xaml win-universal-app collectionviewsource uwp

我正在使用d:DesignInstance在设计器中获取设计时数据。我的模型看起来像这样(简化):

interface IModel {
  public ObservableCollection<IConversation> OpenConversations { get; }
}

enum ConversationType {
  Channel, IM
}

interface IConversation {
  public string Name { get; }
  public ConversationType ConversationType { get; }
}

然后我有一个模拟模型,在OpenConversations属性中有几个条目。这在我的ItemsSource中用作ListView时效果很好。我简化的XAML视图如下所示:

<Page d:DataContext="{d:DesignInstance Type=mocks:MockModel, IsDesignTimeCreatable=True}">
  <ListView ItemsSource="{Binding OpenConversations}"/>
</Page>

上面的示例按预期工作,我得到了设计时数据。

但是现在我想使用ListView在我的CollectionViewSource中添加分组,所以我将以下内容添加到我的XAML中:

<Page.Resources>
  <CollectionViewSource x:Name="OpenConversations" IsSourceGrouped="True" />
</Page.Resources>

并将ListView更改为:

<ListView ItemSource="{StaticResource OpenConversations}" />

我无法弄清楚的是如何将设计数据输入到 CollectionViewSource,我尝试了以下操作,但它不起作用:

<CollectionViewSource ... Source="{Binding OpenConversations}" />

根据https://msdn.microsoft.com/en-us/library/windows/apps/xaml/hh780627.aspx的文档,我需要(在代码隐藏中)分配CollectionViewSource.Source = from conversation in OpenConversations group by conversation.ConversationType into group select group。但我无法弄清楚如何使用设计时数据来做到这一点。

1 个答案:

答案 0 :(得分:0)

首先尝试定义群组的外观我是指群组的标题,还有更多

public class  Group<T> : ObservableCollection<T>, INotifyPropertyChanged
{
  public Group(string name,IEnumerable<T> items):base(items)
   { Name=name;
   }
  //more ...
}

此类不仅用于静态数据,还用于处理不断变化的数据。 现在,如果你使用MVVM模型在你的viewmodel(home)中定义一个属性ListGroup(你想要的名字)类型new ObservableCollection&gt; PS不是真正的代码只是模型给出一个ideea。

 var s=var s = from val in OpenConversations group val by val.Conversationb into g select new Group<IConversation>(g.Key.ToString(), g);
 GroupList = new ObservableCollection<Group<IConversation>>(s);

现在创建一个就像你在资源中的CollectionViewSource之前做的那样

    <CollectionViewSource x:Key="cvs" IsSourceGrouped="True" Source="{Binding Source={StaticResource home},Path=GroupList}"/>

      <ListView ItemsSource="{Binding Source={StaticResource cvs}}">
        <ListView.ItemTemplate>
            <DataTemplate>
                <StackPanel Background="Salmon" Width="100" Height="100">
                    <TextBlock  Text="{Binding Name}"/>
                </StackPanel>
            </DataTemplate>              
        </ListView.ItemTemplate>
        <ListView.GroupStyle>
            <GroupStyle >
                <GroupStyle.HeaderTemplate>
                    <DataTemplate>
                        <Grid Background="LightGray"  >
                            <TextBlock Text='{Binding Name}' Foreground="Black" Margin="10"
                           Style="{StaticResource SubheaderTextBlockStyle}" />
                        </Grid>
                    </DataTemplate>
                </GroupStyle.HeaderTemplate>
            </GroupStyle>
        </ListView.GroupStyle>               
    </ListView>

了解如何在此处添加更多属性来定义GroupSyle 它最适合完全控制我在w10应用程序中使用它。 加上a有部分设计时间帮助(仅显示列表):))不显示组头(GroupView)