首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ObservableCollection和WPF ListBox绑定

ObservableCollection和WPF ListBox绑定
EN

Stack Overflow用户
提问于 2011-11-18 22:37:33
回答 1查看 2.5K关注 0票数 1

我有ObservableCollection和WPF ListBox相互绑定。添加ObservableCollection时,我希望在列表框中同时显示芯片位置。

代码语言:javascript
复制
<Window x:Class="Apeiron.ZoneSetter.ZoneSetterWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"        
        Height="765" Width="765">
         <Grid>                  
            <ListBox Name="lbPosList" ItemsSource="{Binding }" ></ListBox>
         </Grid>
 </Window>

案例1)它工作得很好。当ObservableCollection被更改时,它会在ListBox上显示已老化的芯片pos。

代码语言:javascript
复制
public partial class ZoneSetterWindow : Window, INotifyPropertyChanged
  {
    public ZoneSetterWindow()
    {
        InitializeComponent();
        lbChipList.DataContext = SelectedZoneChipList;            
    }

    public void AddChip(ZoneMapChipInfo chip)
    {
          if (!m_SelectedChipDic.ContainsKey(chip.Point))
        {
            m_SelectedChipDic.Add(chip.ChipPos, chip);                
            m_selectedzonechiplist.Add(chip);
        }
    }


    private Dictionary<Point, ZoneMapChipInfo> m_SelectedChipDic = new Dictionary<Point, ZoneMapChipInfo>();

    private ObservableCollection<ZoneMapChipInfo> m_selectedzonechiplist = new ObservableCollection<ZoneMapChipInfo>();
    public ObservableCollection<ZoneMapChipInfo> SelectedZoneChipList
    {
        get
        {
            return m_selectedzonechiplist;
        }

    }       

  }

例2)它不起作用。尽管ObservableCollection被更改了,但它并没有显示出ListBox上的已老化的芯片pos。

代码语言:javascript
复制
public partial class ZoneSetterWindow : Window, INotifyPropertyChanged
{
    public ZoneSetterWindow()
    {
        InitializeComponent();
        lbChipList.DataContext = SelectedZoneChipList;            
    }

    public void AddChip(ZoneMapChipInfo chip)
    {
          if (!m_SelectedChipDic.ContainsKey(chip.Point))
        {
            m_SelectedChipDic.Add(chip.ChipPos, chip);                
            m_selectedzonechiplist.Add(chip);
        }
    }


    private Dictionary<Point, ZoneMapChipInfo> m_SelectedChipDic = new Dictionary<Point, ZoneMapChipInfo>();

    private ObservableCollection<ZoneMapChipInfo> m_selectedzonechiplist = new ObservableCollection<ZoneMapChipInfo>();
    public ObservableCollection<ZoneMapChipInfo> SelectedZoneChipList
    {
        get
        {
             ObservableCollection<WaferZoneMapChipInfo> result = new ObservableCollection<WaferZoneMapChipInfo>();
            foreach (ZoneMapChipInfo info in m_SelectedChipDic.Values)
            {
                result.Add(info);
            }
            return result;
        }

    }       

}

我想始终同步m_SelectedChipDic和SelectedZoneChipList,并显示ChipPosition of SelectedZoneChipList at ListBox。

我不知道这两种情况有什么不同。

有没有人能理解我的上述问题。谢谢!!

EN

回答 1

Stack Overflow用户

发布于 2011-11-18 23:18:32

您的问题是,在第一种方法中,SelectedZoneChipList返回列表视图绑定到的m_selectedzonechiplist。这就是当您在列表中添加某些内容时,它正在更新UI的原因。在第二种方法中,SelectedZoneChipList返回一个与m_selectedzonechiplist无关的全新列表。因此,当您向m_selectedzonechiplist添加某些内容时,不会发生任何事情,因为ListBox绑定到一个完全不同的对象。

ListBox的绑定大致如下所示:

  1. UI在建立绑定时只获取一次DataContext
  2. 它订阅CollectionChanged更改的事件处理程序( ObservableCollection实现的)。
  3. 每次更改集合时,它都会引发UI响应的事件。

Update:关于I want to synchronize m_SelectedChipDic and SelectedZoneChipList always:您可以摆脱ObservableCollection,使m_SelectedChipDic成为ObservableDictionary,并将ListView绑定到该ObservableDictionary

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8190035

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档