WPF Itemcontrol и datatemplate не отображаются должным образом
У меня проблема с использованием ItemControl, DataTemplate и Visifire Charts.
Во-первых, код в XAML выглядит следующим образом
<DataTemplate x:Key="markerChartTemplate">
<vc:Chart Height="200" Theme="Theme1" Style="{StaticResource ChartStyle}">
<vc:Chart.Series>
<vc:DataSeries RenderAs="Line" LightWeight="true" ShadowEnabled="false" LightingEnabled="false" MarkerSize="4" LineThickness="1" DataPoints="{Binding _xAxisCollection}" />
<vc:DataSeries RenderAs="Line" LightWeight="true" ShadowEnabled="false" LightingEnabled="false" MarkerSize="4" LineThickness="1" DataPoints="{Binding _yAxisCollection}" />
<vc:DataSeries RenderAs="Line" LightWeight="true" ShadowEnabled="false" LightingEnabled="false" MarkerSize="4" LineThickness="1" DataPoints="{Binding _zAxisCollection}" />
</vc:Chart.Series>
</vc:Chart>
</DataTemplate>
<ScrollViewer HorizontalScrollBarVisibility="Disabled" HorizontalAlignment="Stretch" VerticalScrollBarVisibility="Auto">
<ItemsControl VerticalAlignment="Stretch" HorizontalAlignment="Stretch" ItemsSource="{Binding Path=_markerChartsCollections}" ItemTemplate="{StaticResource markerChartTemplate}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</ScrollViewer>
_markerChartsCollections
определяется как
public ObservableCollection<My3DLineChartObject> _markerChartsCollections
как в ViewModel, так и в Model.
Теперь в модели я инициализирую два My3DLineChartObject
объекты и положить его в _markerChartsCollections
,
В результате я могу видеть два, то же самое число, что и My3DLineChartObject в _markerChartsCollections. Однако свойства в My3DLineChartObject, включая _xAxisCollection, _yAxisCollection и _zAxisCollection, не могут быть показаны.
Может ли кто-нибудь помочь понять, в чем причина?
Выходная информация
'SkeletonMarkerCapture.vshost.exe' (CLR v4.0.30319: SkeletonMarkerCapture.vshost.exe): Loaded 'C:\windows\Microsoft.Net\assembly\GAC_MSIL\PresentationFramework.Aero2\v4.0_4.0.0.0__31bf3856ad364e35\PresentationFramework.Aero2.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'SkeletonMarkerCapture.vshost.exe' (CLR v4.0.30319: SkeletonMarkerCapture.vshost.exe): Loaded 'C:\windows\Microsoft.Net\assembly\GAC_32\Microsoft.Kinect\v4.0_2.0.0.0__31bf3856ad364e35\Microsoft.Kinect.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'SkeletonMarkerCapture.vshost.exe' (CLR v4.0.30319: SkeletonMarkerCapture.vshost.exe): Loaded 'C:\Users\admin\Desktop\Hand\SkeletonMarkerCapture_Good_2\SkeletonMarkerCapture\bin\Debug\AForge.Imaging.dll'. Cannot find or open the PDB file.
'SkeletonMarkerCapture.vshost.exe' (CLR v4.0.30319: SkeletonMarkerCapture.vshost.exe): Loaded 'C:\Users\admin\Desktop\Hand\SkeletonMarkerCapture_Good_2\SkeletonMarkerCapture\bin\Debug\Emgu.CV.dll'. Module was built without symbols.
'SkeletonMarkerCapture.vshost.exe' (CLR v4.0.30319: SkeletonMarkerCapture.vshost.exe): Loaded 'C:\Users\admin\Desktop\Hand\SkeletonMarkerCapture_Good_2\SkeletonMarkerCapture\bin\Debug\Emgu.Util.dll'. Module was built without symbols.
'SkeletonMarkerCapture.vshost.exe' (CLR v4.0.30319: SkeletonMarkerCapture.vshost.exe): Loaded 'C:\Users\admin\Desktop\Hand\SkeletonMarkerCapture_Good_2\SkeletonMarkerCapture\bin\Debug\AForge.dll'. Cannot find or open the PDB file.
The thread 0x75d4 has exited with code 259 (0x103).
'SkeletonMarkerCapture.vshost.exe' (CLR v4.0.30319: SkeletonMarkerCapture.vshost.exe): Loaded 'C:\windows\Microsoft.Net\assembly\GAC_MSIL\PresentationFramework-SystemXmlLinq\v4.0_4.0.0.0__b77a5c561934e089\PresentationFramework-SystemXmlLinq.dll'. Cannot find or open the PDB file.
'SkeletonMarkerCapture.vshost.exe' (CLR v4.0.30319: SkeletonMarkerCapture.vshost.exe): Loaded 'C:\windows\Microsoft.Net\assembly\GAC_MSIL\PresentationFramework-SystemXml\v4.0_4.0.0.0__b77a5c561934e089\PresentationFramework-SystemXml.dll'. Cannot find or open the PDB file.
'SkeletonMarkerCapture.vshost.exe' (CLR v4.0.30319: SkeletonMarkerCapture.vshost.exe): Loaded 'C:\Users\admin\Desktop\Hand\SkeletonMarkerCapture_Good_2\SkeletonMarkerCapture\bin\Debug\GalaSoft.MvvmLight.dll'. Symbols loaded.
'SkeletonMarkerCapture.vshost.exe' (CLR v4.0.30319: SkeletonMarkerCapture.vshost.exe): Loaded 'C:\windows\Microsoft.Net\assembly\GAC_MSIL\UIAutomationTypes\v4.0_4.0.0.`enter code here`0__31bf3856ad364e35\UIAutomationTypes.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
1 ответ
Я включаю комментарии из моего исходного ответа ниже, но после небольшой игры с Visifire у вас могут возникнуть проблемы с дизайном библиотеки (я начал вспоминать об этом, используя ее много лет назад). Многие из DependencyProperties, представленные на графиках, не могут быть связаны с. Я разработал пример, подобный вашему, и разместил его здесь. В частности, привязки с DataPoints управляются изнутри. То, что вы действительно хотите, это связать DataSource. Вам также нужно будет установить отображение YValue, даже если вы используете их тип DataPoint в вашей ViewModel.
Например, ваш DataTemplate должен будет связывать ваши коллекции точек, как это
<DataTemplate x:Key="MarkerChartTemplate">
<vc:Chart Height="200" Width="400">
<vc:Chart.Series>
<vc:DataSeries RenderAs="Line" DataSource="{Binding XAxisCollection}">
<vc:DataSeries.DataMappings>
<vc:DataMapping MemberName="YValue" Path="YValue"/>
</vc:DataSeries.DataMappings>
</vc:DataSeries>
</vc:Chart.Series>
</vc:Chart>
</DataTemplate>
Вы должны взглянуть на документы Visifire для более подробной информации. К сожалению, в документах не очень ясно говорится о том, что другие обновления DependencyProperty не работают в библиотеке.
Другие вещи, которые вы должны проверить и общие хорошие практики:
Похоже, вы пытаетесь использовать диаграммы Visifire для отображения ItemsControl из диаграмм 3-й серии. Есть ряд вещей, которые могут пойти не так. Вот что я бы посоветовал посмотреть.
Сначала проверьте, работают ли ваши привязки. Может быть, вы забыли сделать что-то публичное. Возможно, ваши серии не отображаются, потому что они не уведомляют о свойствах, и вы не установили их при первоначальной привязке. Сложный DataTemplate сначала пойдет на облачные вычисления, поэтому попробуйте что-нибудь попроще
<DataTemplate x:Key="SimplerTemplate">
<UniformGrid Columns="3">
<TextBlock Text="{Binding _xAxisCollection}"/>
<TextBlock Text="{Binding _yAxisCollection}"/>
<TextBlock Text="{Binding _zAxisCollection}"/>
</UniformGrid>
</DataTemplate>
Допустим, вы делаете это, и вы видите строку в каждом TextBlock, которая соответствует Visifire.Charts.DataPointCollection. Замечательно. Это означает, что ваша DataBinding действительно будет работать. В этом случае я бы разместил больше примеров кода о том, как вы определяете свои DataSeries, чтобы кто-то, более знакомый с Visifire, мог помочь (в этом случае вам также следует пометить Visifire).
Однако, скажем, это не работает. Есть одна полезная вещь, которую вы можете проверить из Visual Studio (ваше окно вывода). Есть также несколько способов облегчить отладку вашей программы.
- Проверьте выходные данные консоли на наличие ошибок привязки System.Windows.Data. Если есть опечатка или ваши поля недоступны, WPF сообщит об ошибке.
- Не привязывайтесь к необработанным полям. Сделайте ваши ObservableCollections приватными и доступными только для чтения. Оберните их добытчиком. Вы хотите убедиться, что ни один из ваших других кодов, особенно DataBindings, определенных в XAML, не подменяет ваши коллекции на вас. С привязками TwoWay эту ошибку не сложно сделать.
- В My3DLineChartObject - то же самое, оберните ваши три серии свойствами геттера и свяжите их.
- Реализуйте INotifyPropertyChanged в ваших ViewModel и My3DLineChartObject. Всякий раз, когда вы изменяете одно из полей вашей серии в My3DLineChartObject, вы также захотите вызвать NotifyPropertyChanged("...AxisCollection"). Если вы никогда не меняете их, вы должны сделать их доступными только для чтения и просто предоставить получатель. Опять же, это позволяет избежать их замены привязкой TwoWay.
- Поместите контрольные точки в ваши получатели AxisCollection. Когда вы запускаете свои приложения и отображаете это представление, эти геттеры вызывают? При связывании данных используется отражение, и оно вызывает ваши свойства получателя.
Надеюсь, это поможет.