我想让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>
不要犹豫,告诉我其他方式来实现我的目标。 谢谢