WPF: ListView и редактирование ListViewItemC#

Место общения программистов C#
Ответить
Anonymous
 WPF: ListView и редактирование ListViewItem

Сообщение Anonymous »


Изображение


Я хочу иметь возможность выбирать элемент, а затем редактировать его метку:
  • Выбрать элемент
  • Элемент выделен
  • Нажмите на его метку
  • Текстовый блок метки заменяется на текстовое поле
  • Изменить метку
  • Одновременно можно редактировать только один элемент
Завершить редактирование:
  • Нажмите на значок элемента:
    • Текстовое поле заменяется обратно на TextBlock
    • Элемент остается выделенным
  • Выбирается другой элемент:
    • TextBox заменяется обратно на TextBlock
    • Отредактированный элемент не выделяется
    • Выбранный элемент выделяется и выделяется
  • Любая другая область окна при нажатии:
    • Текстовое поле заменяется обратно на текстовый блок
    • Отредактированный элемент остается выделенным
Поведение должно быть примерно таким же, как в проводнике Windows.

Мне удалось выполнить большую часть требований. Тем не менее я получаю случайные результаты. Например, при первом запуске я мог щелкнуть прямо по ярлыку, чтобы отредактировать его. Сам пункт остается не подсвеченным. Это происходит только при запуске.

Кроме того, использование полосы прокрутки не приводит к смещению фокуса с элемента списка. Это позволяет редактировать несколько элементов одновременно.

XAML

Код: Выделить всё


[*]          MouseLeftButtonDown="OnClickMediaList" IsSynchronizedWithCurrentItem="True">



















































Код

Код: Выделить всё

public partial class DailyImages
{
public DailyImages()
{
InitializeComponent();

ViewModel.DailyImages dailyImages = new ViewModel.DailyImages();
_mediaItemList.DataContext = dailyImages;
}

private void OnClickLabelBlock(object sender, MouseButtonEventArgs e)
{
TextBlock notes = sender as TextBlock;
if (notes == null) return;

MediaItem selectedMedia = notes.DataContext as MediaItem;
if (selectedMedia == null) return;

// Multiple items might be selected
// Clear all selected items
_mediaItemList.SelectedItems.Clear();

// Reselect
selectedMedia.IsSelected = true;
selectedMedia.IsEditing = true;

Mouse.Capture(this, CaptureMode.SubTree);
}

private void OnTextLostFocus(object sender, RoutedEventArgs e)
{
TextBox textBox = sender as TextBox;
if (textBox == null) return;

MediaItem mediaItem = textBox.DataContext as MediaItem;
if (mediaItem == null)
return;

// End the label editing
mediaItem.IsEditing = false;

ReleaseMouseCapture();
}

private void OnClickMediaList(object sender,  MouseButtonEventArgs e)
{
// End the label editing
foreach (MediaItem mediaItem in _mediaItemList.Items)
mediaItem.IsEditing = false;

ReleaseMouseCapture();
}
}
MediaItem.cs

Код: Выделить всё

public class MediaItem : INotifyPropertyChanged
{
private bool _isEditing;
private bool _isSelected;
private string _label;

public MediaItem()
{
IsEditing = false;
_isSelected = false;
}

public bool IsEditing
{
get { return _isEditing; }
set
{
if (_isEditing == value) return;
_isEditing = value;
OnPropertyChanged("IsEditing");
}
}

public string Label
{
get { return _label; }
set
{
_label = value;
OnPropertyChanged("Label");
}
}

public DateTime Date { get; set; }
public string IconPath { get; set; }

public bool IsSelected
{
get { return _isSelected; }
set
{
_isSelected = value;
OnPropertyChanged("IsSelected");
}
}

public event PropertyChangedEventHandler PropertyChanged;

[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
}
DailyImages.cs

Код: Выделить всё

public class DailyImages
{
private ObservableCollection _mediaItems;

public DailyImages()
{
_mediaItems = new ObservableCollection();

_mediaItems.Add(new MediaItem {Label = "Image 1", IconPath = "Resources/Icon1.png"});
_mediaItems.Add(new MediaItem {Label = "Image 2", IconPath = "Resources/Icon2.png"});
_mediaItems.Add(new MediaItem {Label = "Image 3", IconPath = "Resources/Icon3.png"});
_mediaItems.Add(new MediaItem {Label = "Image 4", IconPath = "Resources/Icon4.png"});
_mediaItems.Add(new MediaItem {Label = "Image 5", IconPath = "Resources/Icon5.jpg"});
_mediaItems.Add(new MediaItem {Label = "Image 6", IconPath = "Resources/Icon6.png"});
_mediaItems.Add(new MediaItem {Label = "Image 7", IconPath = "Resources/Icon7.png"});
_mediaItems.Add(new MediaItem {Label = "Image 8", IconPath = "Resources/Icon8.png"});
_mediaItems.Add(new MediaItem {Label = "Image 9", IconPath = "Resources/Icon9.png"});
}

public ObservableCollection MediaItems
{
get { return _mediaItems; }
set { _mediaItems = value; }
}
}
Спасибо за прочтение длинного поста.

Я искал и читал много ответов здесь, в StackOverflow, но ни один из них мне не подошел.

Например:
  • Как элемент управления может обрабатывать щелчок мышью за пределами этого элемента управления?
  • Как обработать событие при нажатии на пустое поле пространство?
  • Как захватить щелчок мыши по элементу в ListBox в WPF?


Подробнее здесь: https://stackoverflow.com/questions/145 ... stviewitem
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»