使用模板将数据分组为itemscontrol(s)

时间:2015-09-24 07:40:09

标签: c# wpf xaml mvvm grouping

根据一些示例和博客,我做了一个小项目来测试我的xaml中的一些元素的分组。代码是:

<Window.Resources>
    <XmlDataProvider x:Key="data">
        <x:XData>
            <Devices xmlns="">
                <Terminal name="Gasoline" Code="00001001" />
                <Terminal name="cherosene" Code="00001002" />
                <Terminal name="Oil" Code="00001002" />
                <Terminal name="Wather" Code="00001003" />
                <Terminal name="cherosene" Code="00001003" />
                <Terminal name="Wather" Code="00001004" />
                <Terminal name="cherosene" Code="00001004" />
                <Terminal name="Oil" Code="00001004" />
                <Terminal name="cherosene" Code="00001004" />
                <Terminal name="alcohol" Code="00001005" />
            </Devices>
        </x:XData>
    </XmlDataProvider>

    <CollectionViewSource x:Key="TerminalByCodes" Source="{Binding Source={StaticResource data}, XPath=Devices/Terminal}">
        <CollectionViewSource.GroupDescriptions>
            <PropertyGroupDescription PropertyName="@Code" />
        </CollectionViewSource.GroupDescriptions>
    </CollectionViewSource>
</Window.Resources>

<Grid>
    <DockPanel>
        <ScrollViewer DockPanel.Dock="Bottom"   VerticalScrollBarVisibility="Auto">
            <ItemsControl ItemsSource="{Binding Source={StaticResource TerminalByCodes}}" >
                <ItemsControl.GroupStyle>
                    <GroupStyle>
                        <GroupStyle.ContainerStyle>
                            <Style TargetType="{x:Type GroupItem}">
                                <Setter Property="Template">
                                    <Setter.Value>
                                        <ControlTemplate TargetType="{x:Type GroupItem}">
                                            <GroupBox Header="{Binding Name}">
                                                <ItemsPresenter/>
                                            </GroupBox>
                                        </ControlTemplate>
                                    </Setter.Value>
                                </Setter>
                            </Style>
                        </GroupStyle.ContainerStyle>
                    </GroupStyle>
                </ItemsControl.GroupStyle>
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <StackPanel Orientation="Horizontal"/>
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding XPath=@name}" Background="#FFDBA8A8" Margin="0,0,10,0" />
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
        </ScrollViewer>
    </DockPanel>
</Grid>

此代码具有以下输出:

enter image description here

如您所见,数据是用xaml编写的。但是,正如你想象的那样,这不是我必须工作的方式。如何更新我的代码以使其与“代码生成数据”一起使用?如果使用mvvm绑定怎么做?

1 个答案:

答案 0 :(得分:1)

Salve Piero!

您可以在视图模型类中实现CollectionViewsSource:

CollectionViewSource viewSource = new CollectionViewSource();

并向其提供一些数据:

    private List<Terminal> terminals = new List<Terminal>
    {
        new Terminal{  Code="00001001", Name= "Gasoline" },
        new Terminal{ Code="00001001", Name= "cherosene"},
        new Terminal{ Code="00001001", Name= "Oil"},
        new Terminal{ Code="00001003", Name= "Gasoline" },
        new Terminal{ Code="00001003", Name= "cherosene"},
        new Terminal{  Code="00001003", Name= "Oil"},
    };
terminalsViewSource.Source = terminals;

在视图模型类中创建一个属性,以便Databinding可以工作:

    public Object TerminalsView
    {
        get { return terminalsViewSource.View; }
    }

在后面的代码中,您可以创建ViewModel:

    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = new ViewModel();
    }

在.xaml中绑定它:

<DataGrid x:Name="datagridTerminals" ItemsSource="{Binding TerminalsView}" AutoGenerateColumns="True" >

另外,在Viewmodel中,您可以添加,过滤,IsSorted,IsGrouped属性,以便您的数据可以过滤(例如按名称),分组(或不分组)和排序。

例如:

<TextBox x:Name="textboxFilter" Text="{Binding Filter}" />

ViewModel中的属性:

    public String Filter
    {
        get { return filter; }
        set
        {
            filter = value;
            terminalsViewSource.View.Refresh();
        }
    }

这里的代码示例中的所有内容都是:

http://1drv.ms/1P8cMVc

Forza!