绑定到可观察集合的文本框未更新

本文关键字:文本 更新 集合 观察 绑定 | 更新日期: 2023-09-27 18:30:35

我有一个绑定到可观察集合的文本框,当我更新元素时(通过拖放触发在视图文件中处理的事件),文本框不会更新其值。但是,数据在删除时被添加到可观察集合中,如果我刷新数据(通过在列表框中实际选择其他项并切换回当前记录),则会显示数据。

我读过:http://updatecontrols.net/doc/tips/common_mistakes_observablecollection,不,我不相信我正在覆盖收藏!

<StackPanel>
    <TextBox Text="{Binding Path=ImageGalleryFilenames, Converter={StaticResource ListToStringWithPipeConverter}}" Height="41" TextWrapping="Wrap" VerticalAlignment="Top"/>
    <Button Height="25" Margin="0 2" AllowDrop="True" Drop="HandleGalleryImagesDrop">
        <TextBlock Text="Drop Image Files Here"></TextBlock>
    </Button>
</StackPanel>

这是我的事件代码,用于处理用户控件的视图文件中的删除。

    private void HandleGalleryImagesDrop(object sender, DragEventArgs e)
    {
        if (e.Data.GetDataPresent(DataFormats.FileDrop))
        {
            var filenames = (string[])e.Data.GetData(DataFormats.FileDrop);
            foreach (var fn in filenames)
            {
                this.vm.CurrentSelectedProduct.ImageGalleryFilenames.Add(fn);
            }
        }
    }

添加到集合的事实不应该足以更新绑定到可观察集合的文本框,还是我错过了一些显而易见的东西?

绑定到可观察集合的文本框未更新

本质上,TextBox不可能知道绑定到Text的集合已更新。由于 Text 属性不侦听CollectionChanged事件,因此更新ObservableCollection也将如@Clemens所指出的那样被忽略。

在您的视图模型中,这是一种方法。

    private ObservableCollection<ImageGalleryFilename> _imageGalleryFilenames;
    public ObservableCollection<ImageGalleryFilename> ImageGalleryFilenames
    {
        get
        {
            return _imageGalleryFilenames;
        }
        set
        {
            _imageGalleryFilenames= value;
            if (_imageGalleryFilenames!= null)
            {
                _imageGalleryFilenames.CollectionChanged += _imageGalleryFilenames_CollectionChanged;
            }
            NotifyPropertyChanged("ImageGalleryFilenames");
        }
    }
    private void _imageGalleryFilenames_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {
        NotifyPropertyChanged("ImageGalleryFilenames");
    }
    public event PropertyChangedEventHandler PropertyChanged;
    protected void NotifyPropertyChanged(String propertyName = "")
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }