WPF ItemsControl 的 ItemsSource 绑定的一个bug

本文探讨了WPF中ComboBox绑定同一数据源时出现的选择项同步现象,并提供了解决方案,即通过ToArray()方法克隆数据源,避免选择项同步。

不知道是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同步的.

转载于:https://www.cnblogs.com/yinpengxiang/archive/2009/05/08/1452859.html

以下是一个使用WPF Prism框架中的ItemsControl控件和绑定数据源的示例代码: 1. 在XAML中添加ItemsControl控件 ```xml <ItemsControl x:Name="MyItemsControl" ItemsSource="{Binding MyItems}"> <ItemsControl.ItemTemplate> <DataTemplate> <!-- 在这里定义控件模板 --> </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl> ``` 2. 在ViewModel中定义数据源和属性 ```csharp private ObservableCollection<MyItemViewModel> _myItems; public ObservableCollection<MyItemViewModel> MyItems { get { return _myItems; } set { SetProperty(ref _myItems, value); } } ``` 3. 在ViewModel的构造函数中初始化数据源 ```csharp MyItems = new ObservableCollection<MyItemViewModel>(); MyItems.Add(new MyItemViewModel() { Title = "Item 1", Description = "Description for Item 1" }); MyItems.Add(new MyItemViewModel() { Title = "Item 2", Description = "Description for Item 2" }); MyItems.Add(new MyItemViewModel() { Title = "Item 3", Description = "Description for Item 3" }); ``` 4. 在MyItemViewModel中定义需要绑定的属性 ```csharp public class MyItemViewModel : BindableBase { private string _title; public string Title { get { return _title; } set { SetProperty(ref _title, value); } } private string _description; public string Description { get { return _description; } set { SetProperty(ref _description, value); } } } ``` 5. 在DataTemplate中定义控件模板,绑定对应的属性 ```xml <DataTemplate> <StackPanel> <TextBlock Text="{Binding Title}" /> <TextBlock Text="{Binding Description}" /> </StackPanel> </DataTemplate> ``` 这样,就可以在界面中展示绑定的数据源了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值