2012-07-04 82 views
0

我有一个Observable集合,我试图绑定到ItemsControl。以下是我的代码片段。无法将observale集合绑定到ItemsControl

类Sample.ViewModel:

//Observabale collection getter/setter property 
public ObservableCollection<SQuestion> SList 
{ 
    get 
    {    
     return _sList; 
    } 
    set 
    { 
     if (_sList == value) 
      return; 
     _sList = value; 
     if(PropertyChanged!=null) 
      PropertyChanged(this, new PropertyChangedEventArgs("ListOfSamples")); 
    } 
} 

的.xaml代码:
检视/ Mainwindow.xaml

<ItemsControl Height="422" HorizontalAlignment="Left" Margin="12,12,0,0" Name="listBox1" VerticalAlignment="Top" Width="751" ItemsSource="{Binding SList}" ItemTemplate="{StaticResource perItemTemplate}"/> 

在上面的代码中,我的指定的ItemsSource绑定,但在运行我的应用程序时,列表不会出现在ItemsControl中,并且所有内容都显示出来但是,如果我尝试从我的.cs代码隐藏中将源代码分配给Listbox作为listBox1.ItemsSource = SList,则列表框会填充并按预期工作。
有人可以指出上面的问题,我正在做的绑定,我可以直接绑定xaml而不使用代码隐藏?

+3

如何/在哪里为您的Mainwindow设置'DataContext'?运行时VisualStudio的Output窗口中是否存在绑定错误?顺便提一下,当你提高'PropertyChanged'时,你应该使用你的属性的名字,例如:你应该写'new PropertyChangedEventArgs(“SList”)' – nemesv

+0

@nemesv:我在加载应用程序时添加了这一行 - 'this.DataContent = _collection .SList;'这使得应用程序运行良好。但是,我不知道'DataContext'和你指出的其他事情。你能通过一个链接,我可以快速学习这一点。 (初学WPF相关的东西) – user1372448

回答

0

这应该工作。

在代码隐藏:

public void MyInitialization() 
{ 
    listBox1.DataContext = SList; 
} 

//Observabale collection getter/setter property 
public ObservableCollection<SQuestion> SList 
{ 
    get 
    {    
     return _sList; 
    } 
    set 
    { 
     if (_sList == value) 
      return; 
     _sList = value; 
     if(PropertyChanged!= null) 
      PropertyChanged(this, new PropertyChangedEventArgs("SList")); 
    } 
} 

在XAML:

<ItemsControl Height="422" HorizontalAlignment="Left" 
       Margin="12,12,0,0" Name="listBox1" VerticalAlignment="Top" 
       Width="751" ItemsSource="{Binding} 
       ItemTemplate="{StaticResource perItemTemplate}"/> 
0

你在虚拟机属性名称是SList,但你用不同的名字上升的PropertyChange:PropertyChanged(this, new PropertyChangedEventArgs("ListOfSamples"));。用PropertyChanged(this, new PropertyChangedEventArgs("SList"));代替它,并且应该是好的(假设VM连线正确)