如何在XAML

时间:2018-02-14 09:05:58

标签: c# wpf xaml itemscontrol collectionviewsource

我想让ItemsControl和CollectionViewSource一起工作,但是尽管我的研究我不能这样做。

我想从我的数据中创建不同的数据网格。

     Machine1                                Machine2
--------------------                   -------------------    
Path | Value | Time                    Path | Value | Time 
--------------------                   -------------------
item |  45   | 02:05                   i2   | azeaz | 01:05
item2| ae ea | 02:04                   i3   |  4225 | 02:05

我有一个字典,其中包含例如Machine1作为键和一个Tag in value列表(标签是一个具有我的路径/值/时间的对象)

private Dictionary<string, ItemsChangeObservableCollection<TagViewModel>> _dicoTags;

我想在XAML中对这些数据进行排序,而不是在代码隐藏或我的代码中。我只通过我的代码中的数据生成,但我想在datagrid中对此进行排序。

我的主要问题是:每次更新数据网格时,我的所有行都被推入上面的行,第一行被推到底部,所以人类无法读取我的数据网格,因为例如i2将从来没有在同一个地方(我希望i2不要动摇,只是他的价值和时间戳udpate)。

我的代码是这样做的,因为我使用了一个自定义的ObservableCollection,它在更新时触发事件(然后它删除我的oldItem并添加新的,而不是在我的可观察集合中搜索和重新启动项目以获得性能,然后如果删除它,它也从我的视图中删除...)所以在我的观点中,如果我总是用相同的方法对我的列表进行排序,所有行将在同一个地方并且不会动摇,我只会看到我的值更新而没有毛刺。

因此,经过一些研究,我认为使用CollectionViewSource对我的列表进行排序是一个好主意,但我无法使其正常工作。我试过这个topic for creating collection view source in xaml

我也搜索直接在我的商业代码中对主要集合进行排序,但我觉得在我的情况下在XAML中做得更好。

我只是让我在XAML中查看我的视图代码,因为所有工作正常而没有排序,我只想让ItemsControl和CollectionViewSource一起工作。

<ItemsControl x:Name="itemControlTags" 
        ItemsSource="{Binding CurrentModuleItem.DicoTags}"  
        >
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <WrapPanel Orientation="Horizontal"  
                Background="White"
                Width="{Binding ActualWidth, ElementName=itemControlTags}" 
                Height="{Binding ActualHeight, ElementName=itemControlTags}"  />
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>

            <ItemsControl.Resources>
                <CollectionViewSource x:Key="ViewSourceList" Source="{Binding Value?????}">
                    <CollectionViewSource.SortDescriptions>
                        <scm:SortDescription PropertyName="OPCPath"/>
                    </CollectionViewSource.SortDescriptions>
                </CollectionViewSource>
            </ItemsControl.Resources>

            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <StackPanel Margin="20">
                        <TextBlock Text="{Binding Key}"></TextBlock>
                        <DataGrid AutoGenerateColumns="False" 
                          CanUserAddRows="False" 
                          IsReadOnly="True" 
                          CanUserDeleteRows="False" 
                          Name="TagsDatagrid"
                          ItemsSource="{Binding Source={StaticResource ViewSourceList}}">
                            <DataGrid.Columns>
                                <DataGridTextColumn Header="OPC Path" Binding="{Binding Path=OPCPath, Mode=TwoWay}"></DataGridTextColumn>
                                <DataGridTextColumn Header="Value" Binding="{Binding Path=Value, Mode=TwoWay}"></DataGridTextColumn>
                                <DataGridTextColumn Header="Timestamp" Binding="{Binding Path=FormatedTimestamp, Mode=OneWay}"></DataGridTextColumn>
                                <DataGridTextColumn Header="Quality" Binding="{Binding Path=Quality, Mode=TwoWay}">
                                    <DataGridTextColumn.ElementStyle>
                                        <Style TargetType="{x:Type TextBlock}">
                                            <Style.Triggers>
                                                <Trigger Property="Text" Value="Good">
                                                    <Setter Property="Background" Value="LightGreen"/>
                                                </Trigger>
                                                <Trigger Property="Text" Value="Bad">
                                                    <Setter Property="Background" Value="Red"/>
                                                </Trigger>
                                            </Style.Triggers>
                                        </Style>
                                    </DataGridTextColumn.ElementStyle>
                                </DataGridTextColumn>
                            </DataGrid.Columns>
                        </DataGrid>
                    </StackPanel>

                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </ScrollViewer>

不要犹豫,告诉我其他方式来实现我的目标。 谢谢

0 个答案:

没有答案