0

ItemControl、DataTemplate、および Visifire チャートの使用に問題があります。

まず、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 の両方で。

さて、Model で 2 つのMy3DLineChartObjectオブジェクトを初期化し、それを に入れ_markerChartsCollectionsます。

その結果、_markerChartsCollections の My3DLineChartObject と同じ数の 2 つが表示されます。ただし、_xAxisCollection、_yAxisCollection、_zAxisCollection などの My3DLineChartObject のプロパティは表示できません。

考えられる理由を理解できる人はいますか?

出力情報は

'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.
4

1 に答える 1

0

以下に元の回答からのコメントを含めますが、Visifire で少し遊んだ後、実際にライブラリの設計に問題が発生する可能性があります (私は何年も前に使用してからこれを思い出し始めました)。チャートで公開されている DependencyProperties の多くはバインドできません。私はあなたのような例を考え出し、ここに投稿しました。具体的には、DataPoints とのバインディングは内部で管理されます。本当に必要なのは、DataSource をバインドすることです。ViewModel で DataPoint タイプを使用している場合でも、 YValue マッピングを設定する必要があります。

たとえば、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 チャートを使用して 3 シリーズ チャートの ItemsControl を表示しようとしているようです。うまくいかない可能性のあることがいくつかあります。ここに私が見ることを提案したいものがあります。

まず、バインディングが機能しているかどうかを確認します。何かを公開するのを忘れてしまったのかもしれません。おそらく、シリーズはプロパティに通知しておらず、最初のバインド時に設定していないため、シリーズが表示されていません。複雑な DataTemplate を持つことは、最初は物事を曇らせるだけなので、次のような単純なものを試してください

<DataTemplate x:Key="SimplerTemplate">
    <UniformGrid Columns="3">
        <TextBlock Text="{Binding _xAxisCollection}"/>
        <TextBlock Text="{Binding _yAxisCollection}"/>
        <TextBlock Text="{Binding _zAxisCollection}"/>
    </UniformGrid>
</DataTemplate>

これを実行すると、Visifire.Charts.DataPointCollection に対応する各 TextBlock に文字列が表示されるとします。それは素晴らしいことです。これは、DataBinding が実際に機能することを意味します。その場合、DataSeries の定義方法に関するサンプル コードを投稿して、Visifire に詳しい人が助けてくれるようにします (その場合も Visifire にタグを付ける必要があります)。

ただし、機能しないとしましょう。Visual Studio (出力ウィンドウ) 内から確認できる便利な機能が 1 つあります。プログラムをデバッグしやすくする方法もいくつかあります。

  • System.Windows.Data バインディング エラーのコンソール出力を確認します。タイプミスがあるか、フィールドにアクセスできない場合、WPF はそれに関するエラーをログに記録します。
  • 生のフィールドにバインドしないでください。ObservableCollections を非公開にして読み取り専用にします。それらをゲッターでラップします。他のコード、特に XAML で定義された DataBinding が内部でコレクションを交換していないことを確認する必要があります。TwoWay バインディングでは、その間違いを犯すことは難しくありません。
  • My3DLineChartObject で - 同じことで、3 つのシリーズをゲッター プロパティでラップし、それらにバインドします。
  • ViewModel と My3DLineChartObject に INotifyPropertyChanged を実装します。My3DLineChartObject のシリーズ フィールドの 1 つを変更するたびに、NotifyPropertyChanged("...AxisCollection") も発生させる必要があります。それらを変更しない場合は、それらを読み取り専用にして、getter を提供するだけにしてください。繰り返しますが、これにより、TwoWay バインディングによってそれらが交換されるのを回避できます。
  • AxisCollection ゲッターにブレークポイントを設定します。アプリケーションを実行してこのビューを表示すると、それらのゲッターが呼び出されますか? データバインディングはリフレクションを使用し、ゲッター プロパティを呼び出します。

それが役立つことを願っています。

于 2015-04-19T13:54:41.880 に答える