【问题标题】:Getting a WPF Listview to display ObservableCollection<T> using databinding使用数据绑定获取 WPF Listview 以显示 ObservableCollection<T>
【发布时间】:2011-06-08 12:22:18
【问题描述】:

我有一个 Project 类型的可观察集合,我想在 ListView 中显示,但没有任何东西添加到我的 ListView 中,我真的不明白

我的 MainWindow.xaml

            <ListView Name="ListViewProjects" Grid.Column="0" Grid.RowSpan="3" SelectionChanged="ListViewProjectsSelectionChanged" ItemsSource="{Binding}" IsSynchronizedWithCurrentItem="True" MinWidth="100">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <WrapPanel>
                        <TextBlock Text="{Binding Path=ProjectID}"/>
                        <TextBlock Text="{Binding Path=ProjectName}"/>
                    </WrapPanel>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

我的 MainWindow.cs

    public partial class MainWindow : Window
{
    ObservableCollection<Project> Projects = new ObservableCollection<Project>();
    ObservableCollection<Employee> Employees = new ObservableCollection<Employee>();

    public MainWindow()
    {
        InitializeComponent();

        DataContext = Projects;

        Project pro1 = new Project(1, "Swordfish");
        Projects.Add(pro1);
        Employee empMads = new Employee("Mads", 1);
        Employee empBrian = new Employee("Brian", 2);
        Employees.Add(empMads);
        Employees.Add(empBrian);
    }

    private void ListViewProjectsSelectionChanged(object sender, SelectionChangedEventArgs e)
    {
    }
}

还有我的 Project.cs 是类文件

[Serializable]
class Project : INotifyPropertyChanged
{
    public Project(int id, string name)
    {
        ID = id;
        Name = name;
    }

    private int id;
    public int ID
    {
        get { return id; }
        set
        {
            id = value;
            NotifyPropertyChanged("ProjectID");
        }
    }

    private string name;
    public string Name
    {
        get { return name; }
        set
        {
            name = value;
            NotifyPropertyChanged("ProjectName");
        }
    }

    [field: NonSerialized]
    public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged(String info)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(info));
        }
    }
}

但是我的列表中没有添加任何内容,我看不到我缺少什么以使其正常工作。

我把它作为一个 observablecollection 我做 DataContext = 集合 我在 xaml 文件中进行绑定

编辑代码部分 1:

        public ObservableCollection<Project> Projects { get; set; }
    public ObservableCollection<Employee> Employees { get; set; }

    public MainWindow()
    {
        InitializeComponent();
        Projects = new ObservableCollection<Project>();
        Employees = new ObservableCollection<Employee>();

        DataContext = Projects;

【问题讨论】:

  • 认为您可以发布如何设置 DataContext?

标签: c# .net wpf binding observablecollection


【解决方案1】:

这是因为您使用像 ProjectID 这样的绑定路径,而您的 Project 类具有属性 IDProjectNameName 属性也是如此。

E: 当您遇到绑定问题时,在 Visual Studio 的调试模式下查看 Output 选项卡以查看数据绑定引擎返回了哪些错误非常有用。这些异常通常不会返回给用户,但您可以在那里检查它们。

【讨论】:

  • 这行得通,但是当我的输出或错误列表以错误的方式写入时,我看不到任何内容。顺便说一句,我在同一个 xaml 文档数据中的组合框是否可以绑定到另一个列表?
  • System.Windows.Data 错误:40:BindingExpression 路径错误:在 'object' ''Project' (HashCode=41717140)' 上找不到 'ProjectID' 属性。绑定表达式:路径=项目 ID; DataItem='项目' (HashCode=41717140);目标元素是'TextBlock'(名称='');目标属性是“文本”(输入“字符串”) - 这是我第一次启动代码时在输出窗口中找到的消息。是的,可以在运行时更改数据源(我想这就是您所要求的),但是这里我没有足够的空间。我相信你可以在网上找到如何做到这一点。
  • 很有用,因为我不知道 VS 会输出数据绑定错误。这将大大减少我的 XAML/WPF 调试时间,干杯!
  • 我在任何地方都没有看到这些错误,不知道为什么我的不输出那个
  • 在“显示输出自:”下拉菜单中的“输出”窗口中,您选择了什么?应该有调试。如果它设置为构建,则选择调试。希望它会工作。
【解决方案2】:

正如所指出的,这里存在一些问题。作为新的 WPF 开发人员,其中一个“陷阱”是您不能使用成员变量,而必须使用公共属性:

public ObservableCollection<Project> Projects { get; set; }
public ObservableCollection<Employee> Employees { get; set; }

这些当然需要在你的构造函数中初始化。

完成此操作后,您需要确保集合的属性与您在 ListView 上绑定的属性相匹配。

【讨论】:

  • 好吧,也许我错了,但你可以使用私有字段作为数据上下文(这就是 Mech0z 正在做的事情),一切正常。
  • 谢谢,一旦我将公共字段转换为属性,绑定就开始工作了。
【解决方案3】:

默认情况下,您的成员变量将是私有的。如果您在此处发布的是您的实际代码,则 XAML 无法访问它。公开这些属性:

public ObservableCollection<Project> Projects = new ObservableCollection<Project>();
public ObservableCollection<Employee> Employees = new ObservableCollection<Employee>();

【讨论】:

  • 那些是公共领域,不确定,但我认为这也行不通。
  • 实例字段默认是私有的。如果您查看他的代码,他会省略任何范围修饰符,这使它们成为私有的。
  • 我的意思是你写的是公共字段,据我所知绑定需要公共属性。
  • 没关系,因为你也可以将私有字段设置为数据上下文。或者至少它在我的 VS2010 上运行良好;)
  • 当然这是可能的,你只需要两个具有不同路径的绑定(这是你不应该将窗口的 DataContext 设置为与其属性之一一样具体的另一个原因,而是通过“DataContext = this;”将其设置为自身,则绑定为 {Binding Projects) 和 {Binding Employees})
【解决方案4】:

1.您的列表必须是公共属性(编辑:除非您像以前那样设置 DataContext...)(public ObservableCollection&lt;Project&gt; Projects {get;})

2.您的通知应与实际属性名称相同:

private int id;
public int ID
{
    get { return id; }
    set
    {
        id = value;
        NotifyPropertyChanged("ID");
    }
}

3.绑定也需要这样:

<TextBlock Text="{Binding Path=ID}"/>

我觉得……

【讨论】:

  • 如果我将它们设为属性,如您在“代码编辑 1”中看到的那样,我添加到主要问题并注释掉 Datacontext = Projects 然后什么都没有添加,那么我需要更改我的绑定我的列表视图,但那应该是什么?
  • 如果您的窗口在 Xaml 中命名为 MyWindow,您的绑定可以使用 ItemsSource="{Binding ElementName=MyWindow, Path=Projects}"
猜你喜欢
  • 2013-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多