C# WPF:What';这是进行嵌套绑定的正确方法
我有三种型号:机器、零件和部件。在我的ui上,我将一个列表框绑定到机器列表,将另一个列表框绑定到所选机器的零件列表。现在,当用户选择一个部件时,我想将datagrid绑定到所选部件的组件列表。我尝试将datagrid的itemssource设置为: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={
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成功了,谢谢!另外还有一些有用的信息:另外还有一些有用的信息: