C# WPF:What';这是进行嵌套绑定的正确方法

C# WPF:What';这是进行嵌套绑定的正确方法,c#,wpf,data-binding,C#,Wpf,Data Binding,我有三种型号:机器、零件和部件。在我的ui上,我将一个列表框绑定到机器列表,将另一个列表框绑定到所选机器的零件列表。现在,当用户选择一个部件时,我想将datagrid绑定到所选部件的组件列表。我尝试将datagrid的itemssource设置为: ItemsSource=“{Binding ElementName=PartSelectList,Path=SelectedItem.Components}” 我还尝试设置它的datacontext和itemssource DataContext={

我有三种型号:机器、零件和部件。在我的ui上,我将一个列表框绑定到机器列表,将另一个列表框绑定到所选机器的零件列表。现在,当用户选择一个部件时,我想将datagrid绑定到所选部件的组件列表。我尝试将datagrid的itemssource设置为:

ItemsSource=“{Binding ElementName=PartSelectList,Path=SelectedItem.Components}”

我还尝试设置它的datacontext和itemssource

DataContext={Binding ElementName=PartSelectList,Path=SelectedItem}

ItemsSource={Binding Components}

但是,如果通过以下方法对零件的组件列表进行更改,则datagrid不会自动更新:

part.Bags.Add(新组件(..)

有人对我应该如何处理这个问题有什么建议吗

更新:我有一个实现INotifyPropertyChanged的类MachineCollection。在我的xaml.cs代码中,我创建了MachineCollection对象,并将主网格绑定到它的Machines属性:

Page1.xaml.cs:

private MachineCollection machines

public Page1()
{
    machineCollection = new MachineCollection();
    MainGrid.DataContext = machineCollection.Machines 
    actionThread = new Thread(InitLists);
    actionThread.Start();
}

public void InitLists()
{
    machineCollection.Machines.AddRange(dbCon.GetAllMachines());
}
课程:

public class MachineCollection : INotifyPropertyChanged
{
    public List<Machine> Machines
    {
        get { return machines; }
        set { machines = value; NotifyPropertyChanged("Machines"); }
    }
}

public class Machine : INotifyPropertyChanged
{
    public List<Part> Parts
    {
        get { return parts; }
        set { parts = value; NotifyPropertyChanged("Parts");
    }
}

public class Part : INotifyPropertyChanged
{
    public List<Component> Components
    {
        get { return components; }
        set { components = value; NotifyPropertyChanged("Components");
    }
}

public class Component : INotifyPropertyChanged
{
    public int Length
    {
        get { return length; }
        set { length = value; NotifyPropertyChanged("Length");
    }
}
公共类机器集合:INotifyPropertyChanged
{
公共列表机器
{
获取{返回机器;}
设置{machines=value;NotifyPropertyChanged(“machines”);}
}
}
公共类计算机:INotifyPropertyChanged
{
公开零件清单
{
获取{返回部分;}
设置{parts=value;NotifyPropertyChanged(“parts”);
}
}
公共类部分:INotifyPropertyChanged
{
公共列表组件
{
获取{返回组件;}
set{components=value;NotifyPropertyChanged(“组件”);
}
}
公共类组件:INotifyPropertyChanged
{
公共整数长度
{
获取{返回长度;}
设置{length=value;NotifyPropertyChanged(“长度”);
}
}
XAML:


解决这一问题的一种方法是使用ObservableCollection,这是针对这种情况而设计的

public ObservableCollection<Part> Parts
{
    get { return parts; }
    set { parts = value; NotifyPropertyChanged("Parts");
}
公共可观察收集部件
{
获取{返回部分;}
设置{parts=value;NotifyPropertyChanged(“parts”);
}
或者可以实现手动更改的接口inotifycollection


基本上,问题是绑定系统不知道您何时调用Add。如果您每次都重新分配Parts属性,那么系统只会重新绘制所有内容,因此它也会反映更改,但是如果observeCollection不是问题,这是首选方法

解决此问题的一种方法是使用observeCollecti在上,这是为这种情况而设计的

public ObservableCollection<Part> Parts
{
    get { return parts; }
    set { parts = value; NotifyPropertyChanged("Parts");
}
公共可观察收集部件
{
获取{返回部分;}
设置{parts=value;NotifyPropertyChanged(“parts”);
}
或者可以实现手动更改的接口inotifycollection


基本上,问题是绑定系统不知道您何时调用Add。如果您每次都重新分配Parts属性,那么系统只会重新绘制所有内容,因此它也会反映更改,但是如果ObservableCollection不是问题,这是首选的方式

您可以发布包含网格以及您将模型实例绑定到的位置?视图模型在哪里?如果我没有看错您的问题,您是否尝试过?列表类型在添加或删除项目时不会通知。我对WPF比较陌生,不确定ObservableCollections比列表有什么好处。我来试一试。ObservableCollections玩了这个把戏,谢谢!你能发布包含网格的父级的代码以及你将模型实例绑定到的位置吗?还有你的视图模型在哪里?如果我没看错你的问题,你试过了吗?列表类型在添加或删除项时不会通知。我对WPF相当陌生,不确定它能带来什么好处rvableCollections有过多个列表。我来试一试。ObservableCollections成功了,谢谢!另外还有一些有用的信息:另外还有一些有用的信息: