###前提・実現したいこと
WPFアプリケーションを作成しています。
二つのListViewを持つアプリケーションですが、二つのListViewのスクロールバーの挙動を同期させたいと考えています。
※片方がスクロールしたらもう片方も同時にスクロールするイメージです。
WPFのScrollViewerやScrollBarのスクロール位置を同期させる
上記の記事を参考に実装を進めています。
しかし、XAMLの知識が浅いためなのか、うまく同期させられず困っております。
###ソース
※Behaviorは、とりあえず上記の記事をそのまま使わせていただいております。
###1.下記ソースではスクロール同期はされない。
<Grid Grid.Column="0"> <ListView Margin="10,41,5,30" ItemsSource="{Binding ViewA}"> <ListView.ItemContainerStyle> <Style TargetType="{x:Type ListViewItem}"> <Style.Triggers> <DataTrigger Binding="{Binding IsDiff}" Value="true"> <Setter Property="Background" Value="#ffc8c8" /> </DataTrigger> </Style.Triggers> </Style> </ListView.ItemContainerStyle> <ListView.View> <GridView> <GridViewColumn DisplayMemberBinding="{Binding A}" Header="A" /> <GridViewColumn DisplayMemberBinding="{Binding B}" Header="B" /> <GridViewColumn DisplayMemberBinding="{Binding C}" Header="C" /> <GridViewColumn DisplayMemberBinding="{Binding D}" Header="D" /> <GridViewColumn DisplayMemberBinding="{Binding E}" Header="E" /> <GridViewColumn DisplayMemberBinding="{Binding F}" Header="F" /> </GridView> </ListView.View> <i:Interaction.Behaviors> <b:ScrollSyncronizingBehavior ScrollGroup="Group1" Orientation="Vertical" /> </i:Interaction.Behaviors> </ListView> </Grid> <Grid Grid.Column="1"> <ListView Margin="5,41,10,30" ItemsSource="{Binding ViewB}"> <ListView.ItemContainerStyle> <Style TargetType="{x:Type ListViewItem}"> <Style.Triggers> <DataTrigger Binding="{Binding IsDiff}" Value="true"> <Setter Property="Background" Value="#ffc8c8" /> </DataTrigger> <DataTrigger Binding="{Binding IsNone}" Value="true"> <Setter Property="Background" Value="#606060" /> </DataTrigger> </Style.Triggers> </Style> </ListView.ItemContainerStyle> <ListView.View> <GridView> <GridViewColumn DisplayMemberBinding="{Binding A}" Header="A" /> <GridViewColumn DisplayMemberBinding="{Binding B}" Header="B" /> <GridViewColumn DisplayMemberBinding="{Binding C}" Header="C" /> <GridViewColumn DisplayMemberBinding="{Binding D}" Header="D" /> <GridViewColumn DisplayMemberBinding="{Binding E}" Header="E" /> <GridViewColumn DisplayMemberBinding="{Binding F}" Header="F" /> </GridView> </ListView.View> <i:Interaction.Behaviors> <b:ScrollSyncronizingBehavior ScrollGroup="Group1" Orientation="Vertical" /> </i:Interaction.Behaviors> </ListView> </Grid>
###2.ScrollViewerを中で定義してそこにビヘイビアを仕掛けてみるも、XamlParseExceptionが発生
<Grid Grid.Column="0"> <ListView Margin="10,41,5,30" ItemsSource="{Binding ViewA}"> <ListView.ItemContainerStyle> <Style TargetType="{x:Type ListViewItem}"> <Style.Triggers> <DataTrigger Binding="{Binding IsDiff}" Value="true"> <Setter Property="Background" Value="#ffc8c8" /> </DataTrigger> </Style.Triggers> </Style> </ListView.ItemContainerStyle> <ListView.View> <GridView> <GridViewColumn DisplayMemberBinding="{Binding A}" Header="A" /> <GridViewColumn DisplayMemberBinding="{Binding B}" Header="B" /> <GridViewColumn DisplayMemberBinding="{Binding C}" Header="C" /> <GridViewColumn DisplayMemberBinding="{Binding D}" Header="D" /> <GridViewColumn DisplayMemberBinding="{Binding E}" Header="E" /> <GridViewColumn DisplayMemberBinding="{Binding F}" Header="F" /> </GridView> </ListView.View> <ScrollViewer HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Hidden"> <i:Interaction.Behaviors> <b:ScrollSyncronizingBehavior ScrollGroup="Group1" Orientation="Vertical" /> </i:Interaction.Behaviors> </ScrollViewer> </ListView> </Grid> <Grid Grid.Column="1"> <ListView Margin="5,41,10,30" ItemsSource="{Binding ViewB}"> <ListView.ItemContainerStyle> <Style TargetType="{x:Type ListViewItem}"> <Style.Triggers> <DataTrigger Binding="{Binding IsDiff}" Value="true"> <Setter Property="Background" Value="#ffc8c8" /> </DataTrigger> <DataTrigger Binding="{Binding IsNone}" Value="true"> <Setter Property="Background" Value="#606060" /> </DataTrigger> </Style.Triggers> </Style> </ListView.ItemContainerStyle> <ListView.View> <GridView> <GridViewColumn DisplayMemberBinding="{Binding A}" Header="A" /> <GridViewColumn DisplayMemberBinding="{Binding B}" Header="B" /> <GridViewColumn DisplayMemberBinding="{Binding C}" Header="C" /> <GridViewColumn DisplayMemberBinding="{Binding D}" Header="D" /> <GridViewColumn DisplayMemberBinding="{Binding E}" Header="E" /> <GridViewColumn DisplayMemberBinding="{Binding F}" Header="F" /> </GridView> </ListView.View> <ScrollViewer HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Hidden"> <i:Interaction.Behaviors> <b:ScrollSyncronizingBehavior ScrollGroup="Group1" Orientation="Vertical" /> </i:Interaction.Behaviors> </ScrollViewer> </ListView> </Grid>
###発生している問題・エラーメッセージ
上記2のエラー
System.Windows.Markup.XamlParseException が発生しました
HResult=0x80131501
Message='型 'System.Windows.Controls.ItemCollection' のコレクションに値を追加しているときに例外がスローされました。' 行番号 '68'、行位置 '7'。
Source=PresentationFramework
スタック トレース:
at System.Windows.Markup.XamlReader.RewrapException(Exception e, IXamlLineInfo lineInfo, Uri baseUri)
内部例外 1:
InvalidOperationException: ItemsSource が使用中の場合、操作は無効です。代わりに ItemsControl.ItemsSource を使用して要素にアクセスし、変更してください。
###試したこと
テンプレート?を使ってScrollViewerもしくはScrollBarを自分で定義して、その中にBehaviorを仕掛けるみたいなことを考えましたが、実行時に、ItemXamlParseExceptionが発生してしまいます。
ScrollViewerを定義したことで、GridViewColumnの定義自体がなくなってしまっている??のでしょうか。
###補足情報(言語/FW/ツール等のバージョンなど)
それぞれのListViewにはGridViewColumnを定義しています。
ViewModelに定義してあるDataViewをItemsSourceにバインドしています。
基本的にMVVMに準拠しつつ作成を進めています。

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/06/30 04:32 編集