泥庭

2011年1月17日

ListViewあれこれ

Filed under: .NET, WPF — タグ: , — yone64 @ 10:05 PM

その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>

後にいくほど適当だな。。。

広告

コメントする »

まだコメントはありません。

RSS feed for comments on this post. TrackBack URI

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

WordPress.com Blog.

%d人のブロガーが「いいね」をつけました。