using System.Windows.Media; namespace System.Windows.Forms { public partial class ListViewItem : INotifyPropertyChangedImpl { private ListView owner; private string savedText; public string Text { get => SubItems[0].Text; set { if (SubItems[0].Text != value) { SubItems[0].Text = value; this.RaisePropertyChanged(); } } } private int imageIndex = -1; public int ImageIndex { get => imageIndex; set { imageIndex = value; ResetImageSource(); } } private ImageSource imageSource; public ImageSource ImageSource { get { if (imageSource == null) { if (owner.SmallImageList != null && imageIndex != -1) imageSource = owner.SmallImageList.Images.ImageSources[imageIndex]; } return imageSource; } } public int ImageSourceWidth => owner?.SmallImageList != null ? (int)(owner.SmallImageList.ImageSize.Width / owner.DpiScale) : 16; public int ImageSourceHeight => owner?.SmallImageList != null ? (int)(owner.SmallImageList.ImageSize.Height / owner.DpiScale) : 16; private ListViewGroup group; public ListViewGroup Group { get => group; set { group = value; owner?.Items.ResetBindings(); } } private bool isEditing; public bool IsEditing { get => isEditing; set => this.RaiseAndSetIfChanged(ref isEditing, value); } // this is WPF one private bool isSelected; public bool IsSelected { get => isSelected; set { if (isSelected != value) { this.RaiseAndSetIfChanged(ref isSelected, value); if (owner != null) owner.DoItemSelect(this); } } } // this is Winforms one public bool Selected { get => IsSelected; set => IsSelected = value; } public ListViewSubItemCollection SubItems { get; } public int Index => owner.Items.IndexOf(this); public object Tag { get; set; } internal void SetOwner(ListView owner) => this.owner = owner; internal void ResetImageSource() { imageSource = null; RaisePropertyChanged("ImageSource"); RaisePropertyChanged("ImageSourceWidth"); RaisePropertyChanged("ImageSourceHeight"); } public void BeginEdit() { owner.CancelEdit(); owner.control.UpdateLayout(); var args = new LabelEditEventArgs(owner.Items.IndexOf(this)); owner.DoOnBeforeLabelEdit(args); if (!args.CancelEdit) { savedText = Text; IsEditing = true; owner.SetEditedItem(this); } } internal void EndEdit(bool cancel) { var args = new LabelEditEventArgs(owner.Items.IndexOf(this), cancel ? null : Text); owner.DoOnAfterLabelEdit(args); if (args.CancelEdit) cancel = true; IsEditing = false; if (cancel) Text = savedText; owner.SetEditedItem(null); } public void Remove() => owner.Items.Remove(this); public ListViewItem() { SubItems = new(this); } public ListViewItem(string text) : this() { Text = text; } public ListViewItem(string text, int imageIndex) : this() { Text = text; ImageIndex = imageIndex; } } }