私の WPF C# プログラムには、ユーザーが操作できる項目 (順序の変更、コピー/貼り付けなど) を保持するリストボックスがあります。現在、リストボックスで項目を選択して上に移動ボタンをクリックすると、項目が上に移動します。リストされますが、アイテムは強調表示または選択されなくなります。そのため、リストボックス項目を再選択しないと連続操作を行うことができません。
リストボックスの選択と強調表示を強制的に保持するにはどうすればよいですか?
ListBoxのItemsSourceをObservableCollectionにバインドします。次に、ObservableCollectionを操作すると、ListBoxが更新されます。次に例を示します。
XAML:
<Window x:Class="ListBox.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:ListBox="clr-namespace:ListBox" Title="MainWindow" Height="350" Width="525">
<Window.DataContext>
<ListBox:ListBoxViewModel />
</Window.DataContext>
<StackPanel>
<Button Command="{Binding Up}">Up</Button>
<Button Command="{Binding Down}">Down</Button>
<ListBox Grid.Column="0" ItemsSource="{Binding Items}" SelectedIndex="{Binding SelectedIndex, Mode=TwoWay}" />
</StackPanel>
</Window>
とコード:
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Windows.Input;
using GalaSoft.MvvmLight.Command;
namespace ListBox
{
public class ListBoxViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public ObservableCollection<string> Items {get; private set; }
private void ExecuteUp()
{
if (SelectedIndex == 0)
return;
Items.Move(SelectedIndex, SelectedIndex - 1);
}
private void ExecuteDown()
{
if (SelectedIndex >= Items.Count - 1)
return;
Items.Move(SelectedIndex, SelectedIndex + 1);
}
public ICommand Up { get; private set; }
public ICommand Down { get; private set; }
private int m_SelectedIndex = 0;
public int SelectedIndex
{
get { return m_SelectedIndex; }
set
{
m_SelectedIndex = value;
OnPropertyChanged("SelectedIndex");
}
}
public ListBoxViewModel()
{
Items = new ObservableCollection<string>() {"London", "Paris", "Berlin"};
Up = new RelayCommand(ExecuteUp);
Down = new RelayCommand(ExecuteDown);
}
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}
選択されているがデフォルトでフォーカスがない場合、色が失われます
<Style.Resources>
<!-- Background of selected item when focussed -->
<SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}"
Color="Green"/>
<!-- Background of selected item when not focussed -->
<SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}"
Color="LightGreen" />
</Style.Resources>