【问题标题】:ListView Observable Collection Will Not Show MembersListView Observable 集合不会显示成员
【发布时间】:2014-02-09 10:21:14
【问题描述】:

无法让我的列表视图显示数据。

XAML

<Grid>
    <DockPanel>
        <ListView Name="lstDetectedComputers" 
                  MinWidth="200" 
                  DockPanel.Dock="Left" 
                  ItemsSource="{Binding ComputersList}" DisplayMemberPath="ComputerName">
        </ListView>
        <DataGrid x:Name="ViewNetworkCardInformation" 
                  ItemsSource="{Binding NetworkCardInformation}"/>
    </DockPanel>
</Grid>

代码:

private ObservableCollection<Object> _ComputersList;
public ObservableCollection<Object> ComputersList
{
    get 
    { 
        return _ComputersList;
    }

    set 
    {
        _ComputersList = value; NotifyPropertyChanged("ComputersList");
    }
}

private DataTable _NetworkCardInformation;
public DataTable NetworkCardInformation
{
    get 
    { 
        return _NetworkCardInformation; 
    }

    set 
    { 
        _NetworkCardInformation = value; NotifyPropertyChanged("NetworkCardInformation"); 
    }
}

奇怪的是 NetworkCardInformation 显示在我的数据网格中,因此这表明数据上下文正在按预期工作。

现在我对 ObservableCollection 的印象是我不需要 INotifyPropertyChange,如果这是错误的,请告知。

我也尝试过 ItemsSource="{Binding ComputersList}"

我已经在代码中放了一个断点,以确保可观察的集合有数据,并且它在那里。

  • ComputersList 计数 = 2 System.Collections.ObjectModel.ObservableCollection
  • [0] {AdminUltimate.Model.NetworkModel.ComputerNode} 对象 {AdminUltimate.Model.NetworkModel.ComputerNode} ComputerName "ASUS-PC" 字符串

有人可以帮忙吗? 谢谢你

【问题讨论】:

  • 展示错误。 ObservableCollection 实现 INotifyCollectionChanged(不是 INotifyPropertyChanged)。 OC 通知插入和删除 - 不是对现有项目的更改。
  • 尝试将ComputersList 属性声明为ObservableCollection&lt;ComputerNode&gt; 而不是ObservableCollection&lt;Object&gt;
  • 同意har07。 NotifyPropertyChanged("计算机列表");不属于那里。 ComputerNode 需要一个 NotifyPropertyChanged("ComputerName");
  • @Blam - ObservableCollection 实现了INPCINCC。但是,您的另一个断言是正确的,基础对象中的任何属性更改都不会在 GUI 上刷新,因为该对象应实现 INPC
  • @RohitVats 我的立场是正确的

标签: c# wpf listview


【解决方案1】:

您已将DisplayMemberPath 设置为ComputerName,但Object 没有任何此类属性,因此它不会显示任何内容。

这可以通过删除 DisplayMemberPath 来验证,您将看到对象的完全限定类名称,因为如果 ListBox 上没有设置 ItemTemplate 和 DisplayMemberPath,则会在您的对象上调用 ToString()

因此,解决方案是ObservableCollection&lt;Object&gt; 更改为包含属性ComputerName 的更具体对象的类型,即ObservableCollection&lt;ComputerNode&gt;

【讨论】:

  • 您知道他们正在寻找版主。如果你有时间,我想你会是一个很好的主持人。没关系,您没有所需的徽章。
  • 谢谢布拉姆。是的,我刚看到它。但是专业地工作和每天抽出时间会有点乏味。我喜欢打开和关闭 SO,但是就像你说的那样,我的徽章用完了。所以,下次可能会试一试。 :)
猜你喜欢
  • 2019-06-23
  • 2012-12-31
  • 1970-01-01
  • 1970-01-01
  • 2011-01-16
  • 1970-01-01
  • 1970-01-01
  • 2013-07-26
  • 2022-12-11
相关资源
最近更新 更多