Visual Studio/WPF > ListBox 선택 해제 > 자체 제작 클래스의 bfSelected 속성 = false에서 ListBox의 SelectedItems가 남아 있습니다.

운영 환경
Windows 7 Pro (32bit)
Microsoft Visual Studio 2017 Community

h tp : /// s ぇ l. ldb㎉g. jp / archi s / 52333865. HTML
를 바탕으로 학습 중.

링크처에서는 ListBox 아이템의 선택 처리를 하고 있다.

선택한 아이템을 해제하는 처리를 구현해 보았다.
  • Button 추가: B_clear
  • B_clearClick() 처리 구현

  • MainWindow.xaml.cs
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    // 
    using System.Collections.ObjectModel;
    using System.ComponentModel;
    
    namespace _170608_t1523_listBoxMultiSelect
    {
        /// <summary>
        /// MainWindow.xaml の相互作用ロジック
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }
    
            private void listBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
            {
                var myList = (this.DataContext as MyDataList);
                myList.UpdateSelectedItems();
            }
    
            private void B_clearClick(object sender, RoutedEventArgs e)
            {
                var myList = (this.DataContext as MyDataList);
                // 1. 以下ではListBoxの選択状態が残ったままになった
                //foreach (var elem in myList)
                //{
                //    elem.bfSelected = false;
                //}
                //myList.UpdateSelectedItems();
    
                // 2. 以下ではListBoxの選択状態がクリアされる
                listBox1.SelectedItems.Clear();
                myList.UpdateSelectedItems();
            }
        }
    
        public class MyData
        {
            public string Name { get; set; }
            public Nullable<bool> bfSelected { get; set; }
        }
    
        public class MyDataList : ObservableCollection<MyData>
        {
            private int lastYear = 2016;
    
            public MyDataList()
            {
                AddNewItem();
                AddNewItem();
                AddNewItem();
                AddNewItem();
            }
            public void AddNewItem()
            {
                var data = new MyData { Name = string.Format("{0}年", lastYear) };
                this.Add(data);
                lastYear++;
            }
    
            public List<MyData> SelectedItems { get; private set; }
    
            public void UpdateSelectedItems()
            {
                var lnq = Items.Where(
                    x => x.bfSelected.HasValue &&
                    (x.bfSelected.Value == true));
                SelectedItems = new List<MyData>(lnq);
                this.OnPropertyChanged(new PropertyChangedEventArgs("SelectedItems"));
            }
        }
    }
    

    MainWindow.xaml
    <Window x:Class="_170608_t1523_listBoxMultiSelect.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:_170608_t1523_listBoxMultiSelect"
            mc:Ignorable="d"
            Title="MainWindow" Height="350" Width="525">
        <Window.DataContext>
            <local:MyDataList/>
        </Window.DataContext>
        <Window.Resources>
            <Style x:Key="listBoxItemStyle" TargetType="{x:Type ListBoxItem}">
                <Setter Property="IsSelected" Value="{Binding bfSelected}"/>
            </Style>
        </Window.Resources>
        <StackPanel>
            <Button x:Name="B_clear"  
                    Height="28" Width="100" HorizontalAlignment="Left"
                    Content="ClearSelection"
                    Click="B_clearClick"
                    />
            <Grid VerticalAlignment="Stretch" Height="280">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition/>
                    <ColumnDefinition/>
                </Grid.ColumnDefinitions>
                <ListBox Name="listBox1"
                     SelectionMode="Multiple"
                     ItemsSource="{Binding}" 
                     DisplayMemberPath="Name"
                     ItemContainerStyle="{StaticResource listBoxItemStyle}"
                     SelectionChanged="listBox1_SelectionChanged"/>
                <ListBox Name="listBox2"
                     Grid.Column="1"
                     ItemsSource="{Binding SelectedItems}" 
                     DisplayMemberPath="Name"/>
            </Grid>
        </StackPanel>
    </Window>
    
    

    선택 시


    Clear Selection 누름 후


    코드 스니펫


            private void B_clearClick(object sender, RoutedEventArgs e)
            {
                var myList = (this.DataContext as MyDataList);
                // 1. 以下ではListBoxの選択状態が残ったままになった
                //foreach (var elem in myList)
                //{
                //    elem.bfSelected = false;
                //}
                //myList.UpdateSelectedItems();
    
                // 2. 以下ではListBoxの選択状態がクリアされる
                listBox1.SelectedItems.Clear();
                myList.UpdateSelectedItems();
            }
    

    상기에서 1의 처리에서는 DataContext의 myList 요소의 bfSelected는 false가 되어, 오른쪽의 ListBox의 표시는 클리어 되었다.
    한편, 왼쪽의 listBox1의 SelectedItems는 남아 있었다.
    (다음에 선택시 남아 있던 SelectedItems도 선택 상태가 되었다.)

    2의 처리에서는 listBox1의 SelectedItems도 클리어되었다.
    listBox1을 직접 지정하고 있는 점은 좋은가 어떤가. Binding만으로 처리할 수 있는 것이 좋다고는 생각한다.

    좋은 웹페이지 즐겨찾기