zoukankan      html  css  js  c++  java
  • WPF ItemsControl 的 ItemsSource 绑定的一个bug

    不知道是Bug还是什么, 碰到这个问题的.

    我测试了一下,所有ItemsControls子类都有这个问题. 譬如: ComboBox

    public class NameValue
    {
        public object Value { get; set; }
        public string Name { get; set; }
    }

    public class TestObj: INotifyPropertyChanged

    {

        public event PropertyChangedEventHandler PropertyChanged;
        protected void Notify(string propName)
        {
            if (this.PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propName));
            }
        }

        int _v1;
        public int V1{

            get{ return _v1;}

            set{

               if (this._v1== value) { return; }
                    this._v1= value;
                    Notify("V1");

            }

        }

        int _v2;
        public int V2{

            get{ return _v2;}

            set{

               if (this._v2== value) { return; }
                    this._v2= value;
                    Notify("V2");

            }

        }

    }

    初始化List

    List<NameValue> lst = new List<NameValue>();

    lst.Add(new NameValue(){Name=”item1”, Value=”1”});

    lst.Add(new NameValue(){Name=”item2”, Value=”2”});

    lst.Add(new NameValue(){Name=”item3”, Value=”3”});

    绑定到ComboBox

    cbo1.ItemsSource = lst;

    cbo2.ItemsSource = lst;

    dataGrid.DataContext = new TestObj(){

        V1 = 1,

        V2 = 2

    };

    xaml代码

    <Grid x:Name="dataGrid">

    <ComboBox x:Name="cbo1" DisplayMemberPath="Name" SelectedValuePath="Value"  Width="80" IsSynchronizedWithCurrentItem="True"  SelectedValue="{Binding Path=V1}"/>

    <ComboBox x:Name="cbo2" DisplayMemberPath="Name" SelectedValuePath="Value"  Width="80" IsSynchronizedWithCurrentItem="True" SelectedValue="{Binding Path=V2}"/>

    </Grid>

    测试看看, 结果竟然是cbo1和cbo2联动了

    解决办法

    cbo1.ItemsSource = lst.ToArray();

    cbo2.ItemsSource = lst.ToArray();

    dataGrid.DataContext = new TestObj(){

        V1 = 1,

        V2 = 2

    };

    ItemsSource 指向了同一个List导致select同步了, 通过ToArray()方法,其实clone了2个NameValue数组实例, 这样就不会产生select同步的.

  • 相关阅读:
    Day03 小程序代码构成 -------4月19日
    Day02 申请账号和下载微信开发者工具------4月19日
    Day01《起步》 --- 4月19日
    记录EFCORE命令行操作数据库的方式
    关于Angular+ngx-perfect-scrollbar自定义各大浏览器滚动条样式的解决方法
    Angular里使用(image-compressor.js)图片压缩
    moment的简单使用方式
    关于Npoi+excel文件读取,修改文件内容的处理方式
    记录sql中统计近五天数据的口径(While+IF)
    Angular中ngx-image-cropper图片裁剪的使用
  • 原文地址:https://www.cnblogs.com/yinpengxiang/p/1452859.html
Copyright © 2011-2022 走看看