その1、ListViewでやっちゃいけないこと
「等価と判断されるオブジェクトを複数含むListとBind」
いきなり言ってもなんのこっちゃなので、とりあえずコードをば
<XAML>
<Window x:Class="WpfApplication9.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="342" Loaded="Window_Loaded"> <Grid> <ListView Name="listView1" ItemsSource="{Binding}"> <ListView.View> <GridView> <GridViewColumn Header="へっだ" DisplayMemberBinding="{Binding}"/> </GridView> </ListView.View> </ListView> </Grid> </Window>
<C#>
namespace WpfApplication9 { /// <summary> /// MainWindow.xaml の相互作用ロジック /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private void Window_Loaded(object sender, RoutedEventArgs e) { this.DataContext = new[] { "AAA","BBB","CCC","DDD","AAA","BBB","CCC","DDD","AAA","BBB","CCC","DDD", }; } } }
長く見えるけど、ListViewを配置してDataContextにstringの配列を突っ込んでるだけです。
ポイントは、同じ文字列が繰り返し出てくること。後は実行して、適当に選択するとあら不思議。
その2、SelectedItemsとバインド
ListViewのSelectedItemsとは、バインド出来ません。困ったw。
なので、ListViewItemのIsSelectedプロパティとListView.ItemsSourceに含まれるオブジェクトの任意のプロパティーをBindします。
とはいえ、ListViewItemはxaml上には登場してません。ということで、Styleを使用することになります。
<ListView.ItemContainerStyle> <Style TargetType="{x:Type ListViewItem}"> <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" /> </Style> </ListView.ItemContainerStyle>
その3、Contextメニューが表示されたアイテムを取得する
ListViewに表示されているどの項目で右クリックされたか知りたい場合があります。
そんな場合は、ContextMenu.PlacementTargetプロパティをCommandParameterに渡せばOK。
<ListView Name="listView1" ItemsSource="{Binding}"> <ListView.Resources> <ContextMenu x:Key="menu"> <MenuItem Header="メニュー" Command="{Binding HogeCommand}" CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=ContextMenu}, Path=PlacementTarget.Content}"/> </ContextMenu> </ListView.Resources> <ListView.ItemContainerStyle> <Style TargetType="{x:Type ListViewItem}"> <Setter Property="ContextMenu" Value="{StaticResource ResourceKey=menu}"/> </Style> </ListView.ItemContainerStyle> <ListView.View> <GridView> <GridViewColumn Header="へっだ" DisplayMemberBinding="{Binding}"/> </GridView> </ListView.View> </ListView>
後にいくほど適当だな。。。