【问题标题】:Unable to bind observale collection to ItemsControl无法将 observablecollection 绑定到 ItemsControl
【发布时间】:2012-07-04 19:29:55
【问题描述】:

我有一个 Observable Collection,我正在尝试将其绑定到 ItemsControl。以下是我的代码中的 sn-p。

类 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 代码隐藏中将源分配给列表框 listBox1.ItemsSource = SList,列表框将被填充并按预期工作。
有人可以指出上面我正在做的绑定问题是什么,以便我可以直接从 xaml 绑定而不使用代码隐藏?

【问题讨论】:

  • 您如何/在哪里为您的主窗口设置DataContext?运行时 VisualStudio 的输出窗口中是否有任何绑定错误?顺便说一句,当你提出 PropertyChanged 时,你应该使用你的财产名称,例如:你应该写 new PropertyChangedEventArgs("SList")
  • @nemesv:我在加载应用程序时添加了这一行 - this.DataContent = _collection.SList;,这使得应用程序运行良好。但是,我不知道DataContext 和您指出的另一件事。你能传递一个链接,我可以快速学习这个。 (WPF 相关的初学者)

标签: c# wpf


【解决方案1】:

这应该可行。

在代码隐藏中:

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}"/>

【讨论】:

    【解决方案2】:

    您在 VM 中的属性名称是 SList,但您正在使用不同的名称提升 PropertyChange:PropertyChanged(this, new PropertyChangedEventArgs("ListOfSamples"));。用PropertyChanged(this, new PropertyChangedEventArgs("SList"));替换它应该是好的(假设VM连接正确)

    【讨论】:

      猜你喜欢
      • 2011-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-09
      • 2018-05-10
      • 1970-01-01
      相关资源
      最近更新 更多