zoukankan      html  css  js  c++  java
  • ObservableCollection绑定到TextBox

    c# - 绑定(bind)到ObservableCollection的TextBox无法更新

    这个找了好久,百度和Bing都没找到,最后Google的。。。。。。。。。。。

    转载自

    原文 标签 c# wpf xaml binding observablecollection

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

    我读过: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);
                }
            }
        }
    

    我添加到集合中的事实不足以更新绑定到observablecollection的文本框的事实,还是我错过了令人眼花obvious乱的明显东西?

    最佳答案

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

    在您的ViewModel中,这是一种实现方法。

        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));
            }
        } 
    

    以下是测试绑定数组并更新的代码:

    在ViewModel的代码:

    //变量定义
    public event PropertyChangedEventHandler PropertyChanged;
    public ObservableCollection<Byte> DataByte
    {
        get { return _DataByte; }
        set
        {
            _DataByte = value;
            if (_DataByte != null)
            {
                _DataByte.CollectionChanged += _imageGalleryFilenames_CollectionChanged1;
            }
        }
    }
    private void _imageGalleryFilenames_CollectionChanged1(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs("DataByte"));
        }
    }
    //转换器
    public class DataToString1 : IValueConverter
    {
        #region IValueConverter 成员
    
            object IValueConverter.Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if ((value is ObservableCollection<byte>) && value != null)
            {
                string va = "";
                ObservableCollection<byte> TT = (ObservableCollection<byte>)value;
                TT.ToList<byte>().ForEach(t =>
                                          { va += "0x" + t.ToString("X2") + "  "; }
                                         );
                return va;
            }
            return value;
        }
    
        object IValueConverter.ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return value;
        }
        #endregion
    }
    

    View

    <Window.Resources>
        <local:DataToString1 x:Key="AAAA1"/>
    </Window.Resources>
    <StackPanel>
        <TextBlock Text="{Binding DataByte,Converter={StaticResource AAAA1}}" Background="Orange"/>
    </StackPanel>
    
  • 相关阅读:
    成员变量、类变量、局部变量的区别
    微服务学习笔记二:Eureka服务注册发现
    微服务学习笔记一:Spring Cloud简介
    Java集合篇六:Map中key值不可重复的测试
    重写Euqals & HashCode
    Java集合篇五:HashMap
    Java集合篇四:Map的基本应用
    Java集合篇三:Vector
    Java集合篇二:LinkList
    Java集合篇一:ArrayList
  • 原文地址:https://www.cnblogs.com/ycccq/p/14005533.html
Copyright © 2011-2022 走看看