Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF:ListView&;编辑ListViewItem_C#_Wpf_Listview - Fatal编程技术网

C# WPF:ListView&;编辑ListViewItem

C# WPF:ListView&;编辑ListViewItem,c#,wpf,listview,C#,Wpf,Listview,我希望能够选择一个项目,然后编辑其标签: 选择一个项目 项目被突出显示 点击它的标签 标签的文本块替换为文本框 修改标签 一次只能编辑一个项目 结束编辑: 单击项目图标: TextBox被替换回TextBlock 项目仍然突出显示 单击另一项: TextBox被替换回TextBlock 已编辑的项目未被选中 单击的项目被选中并高亮显示 单击窗口的任何其他区域: TextBox被替换回TextBlock 已编辑的项目仍然突出显示 这种行为应该与Windows资源管理器中的行为非常相

我希望能够选择一个项目,然后编辑其标签:

  • 选择一个项目
  • 项目被突出显示
  • 点击它的标签
  • 标签的文本块替换为文本框
  • 修改标签
  • 一次只能编辑一个项目
结束编辑:

  • 单击项目图标:
    • TextBox被替换回TextBlock
    • 项目仍然突出显示
  • 单击另一项:
    • TextBox被替换回TextBlock
    • 已编辑的项目未被选中
    • 单击的项目被选中并高亮显示
  • 单击窗口的任何其他区域:
    • TextBox被替换回TextBlock
    • 已编辑的项目仍然突出显示
  • 这种行为应该与Windows资源管理器中的行为非常相似

    我设法完成了大部分要求。我仍然得到随机结果。例如,在第一次发布时,我可以直接点击标签进行编辑。项目本身未高亮显示。这只在开始时发生

    此外,使用滚动条不会使列表项失去焦点。这允许同时编辑多个项目

    XAML

    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<MediaItem> _mediaItems;
    
        public DailyImages()
        {
            _mediaItems = new ObservableCollection<MediaItem>();
    
            _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<MediaItem> MediaItems
        {
            get { return _mediaItems; }
            set { _mediaItems = value; }
        }
    }
    
    公共类每日图像
    {
    私有可观测集合_mediaItems;
    公共每日图像()
    {
    _mediaItems=新的ObservableCollection();
    _添加(新的MediaItem{Label=“Image 1”,IconPath=“Resources/Icon1.png”});
    _添加(新的MediaItem{Label=“Image 2”,IconPath=“Resources/Icon2.png”});
    _添加(新的MediaItem{Label=“Image 3”,IconPath=“Resources/Icon3.png”});
    _添加(新的MediaItem{Label=“Image 4”,IconPath=“Resources/Icon4.png”});
    _添加(新的MediaItem{Label=“Image 5”,IconPath=“Resources/Icon5.jpg”});
    _添加(新的MediaItem{Label=“Image 6”,IconPath=“Resources/Icon6.png”});
    _添加(新的MediaItem{Label=“Image 7”,IconPath=“Resources/Icon7.png”});
    _添加(新的MediaItem{Label=“Image 8”,IconPath=“Resources/Icon8.png”});
    _添加(新的MediaItem{Label=“Image 9”,IconPath=“Resources/Icon9.png”});
    }
    公共可观察集合媒体项
    {
    获取{return\u mediatems;}
    设置{u mediatems=value;}
    }
    }
    
    谢谢你阅读这篇长文章

    我在StackOverflow搜索并阅读了许多答案,但没有一个对我来说是好的

    例如:


    您可能希望捕获listview上的scrollevent,并明确删除元素上的焦点

        ScrollViewer scrollViewer = GetVisualChild<ScrollViewer>(mTreeView);
        scrollViewer.ScrollChanged += new ScrollChangedEventHandler(scrollViewer.....
    
    ScrollViewer ScrollViewer=GetVisualChild(mTreeView);
    scrollViewer.ScrollChanged+=新的ScrollChangedEventHandler(scrollViewer。。。。。
    
    并在处理程序中移除焦点

    查看此stackoverflow页面,了解如何将焦点从元素移开

    也许在不同的状态下切换IsReadonly属性更好?这样您就不需要再切换可见性了。而且,在这种情况下,最好替换模板。

    感谢您的黑客攻击。实际上,我将隐藏滚动条,并使用按钮进行滚动。
    public class DailyImages
    {
        private ObservableCollection<MediaItem> _mediaItems;
    
        public DailyImages()
        {
            _mediaItems = new ObservableCollection<MediaItem>();
    
            _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<MediaItem> MediaItems
        {
            get { return _mediaItems; }
            set { _mediaItems = value; }
        }
    }
    
        ScrollViewer scrollViewer = GetVisualChild<ScrollViewer>(mTreeView);
        scrollViewer.ScrollChanged += new ScrollChangedEventHandler(scrollViewer.....