none
Listbox内のCheckboxにチェックを入れたときに、Selectedさせたい RRS feed

  • 質問

  • いつもお世話になってます。
    山田です。

    Listbox内でCheckboxを利用しております。
    Listboxが、Selectedされたときは、Checkboxにチェックを入れて、
    Checkboxにチェックされたときは、Selected された状態(選択された状態)にしたいと思っております。

    ListBoxが、Selected されたときは、Binding 時に、Checkbox に対してtrueを入れて、PropertyChangedで
    通知してあげれば、できるのですが、逆に、Checkboxにチェックが入ったときに、ListboxがSelectedされた方法がわからなく、
    御知恵を頂きたいと思いまして、投稿させていただきました。

    お手数をおかけしますが、どのような方法があるかご教授いただけないでしょうか?
    宜しくお願い致します。

    下記は、Listbox Selected されたときに Checkbox をチェックするコードです。

    xaml
                <ListBox Grid.Row="1" Margin="72,12,50,9" SelectedItem="{Binding Path=SelectedRoomObject,Mode=TwoWay}" ItemsSource="{Binding RoomObjects}" >  
    <ListBox.ItemTemplate>
    <DataTemplate>
    <WrapPanel>
    <CheckBox IsChecked="{Binding IsUsed}" />
    <TextBlock Text="{Binding RoomName}" />
    </WrapPanel>
    </DataTemplate>
    </ListBox.ItemTemplate>
    </ListBox>

    ViewModel.cs
            private RoomDto selectedRoomObject;
    public RoomDto SelectedRoomObject
    {
    get { return selectedRoomObject; }
    set
    {
    selectedRoomObject = value;

    foreach (RoomDto roomDto in roomObjects)
    {
    if (selectedRoomObject.RoomId == roomDto.RoomId)
    {
    roomDto.IsUsed = true;
    break;
    }
    }
    OnPropertyChanged("SelectedRoomObject");
    }
    }

    Model.cs

        public class RoomDto : ViewModelBase
    {
    public int? RoomId { get; set; }
    public string RoomName { get; set; }

    private bool used;
    public bool IsUsed
    {
    get
    { return used; }
    set
    {
    used = value;
    OnPropertyChanged("IsUsed");
    }
    }
    }
    2009年8月21日 9:50

回答

  • ListBoxItem に IsSelected というプロパティがあります。
    それと CheckBox の IsChecked を Binding させれば
    CheckedListBox になります。

    検索すればすぐにいくつか見つかります(かずきさんのBlogのがそのものかも)が,
    スタイル(テンプレート)によるコントロールの拡張と
    ItemsControl系のアイテムコンテナのカラクリ(追記: 特に ItemContainerGeneratorクラスがらみ)
    の調査になるので,自分で苦労するのがオススメかも。


    稍丼 / yayadon
    • 編集済み yayadon 2009年8月24日 9:35 追記
    • 回答としてマーク a_山田 2009年8月25日 8:47
    2009年8月24日 7:52

すべての返信

  • ListBoxItem に IsSelected というプロパティがあります。
    それと CheckBox の IsChecked を Binding させれば
    CheckedListBox になります。

    検索すればすぐにいくつか見つかります(かずきさんのBlogのがそのものかも)が,
    スタイル(テンプレート)によるコントロールの拡張と
    ItemsControl系のアイテムコンテナのカラクリ(追記: 特に ItemContainerGeneratorクラスがらみ)
    の調査になるので,自分で苦労するのがオススメかも。


    稍丼 / yayadon
    • 編集済み yayadon 2009年8月24日 9:35 追記
    • 回答としてマーク a_山田 2009年8月25日 8:47
    2009年8月24日 7:52
  • ご回答ありがとうございます。

    http://blog.functionalfun.net/2009/02/how-to-databind-to-selecteditems.html

    のサイトを参考にして、Behaviourを利用して、実現することができました。

    アドバイスありがとうございました。

    2009年8月25日 8:47

  • リンク先は,
    ViewModel側にも SelectedItems に相当するものを持って同期させてますが,
    上の例だと,
    ViewModel 側に IsUsedプロパティがあるので,
    その必要はないんじゃないですかね。

    稍丼 / yayadon
    2009年8月25日 14:56