Visual Studio/WPF > ListBox 선택 해제 > 자체 제작 클래스의 bfSelected 속성 = false에서 ListBox의 SelectedItems가 남아 있습니다.
15031 단어 myVisualStudioStudyWPF#migrated
Windows 7 Pro (32bit)
Microsoft Visual Studio 2017 Community
h tp : /// s ぇ l. ldb㎉g. jp / archi s / 52333865. HTML
를 바탕으로 학습 중.
링크처에서는 ListBox 아이템의 선택 처리를 하고 있다.
선택한 아이템을 해제하는 처리를 구현해 보았다.
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만으로 처리할 수 있는 것이 좋다고는 생각한다.
Reference
이 문제에 관하여(Visual Studio/WPF > ListBox 선택 해제 > 자체 제작 클래스의 bfSelected 속성 = false에서 ListBox의 SelectedItems가 남아 있습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/7of9/items/7b2847e8f0bbe8084b8a텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)