两个 CombBoxes 绑定到对象列表中的对象列表
Two CombBoxes binding to object list inside an object list
我有一个集合绑定到组合框(主组合框)的 Itemsource。这里面是另一个集合,它绑定到 ItemControl 中的另一个组合框,该组合框从不填充。请帮助
xaml
<ComboBox ItemsSource="{Binding NodeNames}" DisplayMemberPath="name"
SelectedValue="{Binding ConditionalNodeId, Mode=TwoWay}" SelectedValuePath="id">
</ComboBox>
</WrapPanel>
<ItemsControl ItemsSource="{Binding ConditionList}" AlternationCount="{Binding ConditionList.Count}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<WrapPanel>
<ComboBox ItemsSource="{Binding NodeMembershipFunction}">
</ComboBox>
</WrapPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Class代码
public class ConditionsVM : INotifyPropertyChanged
{
public ObservableCollection<ConditionsRuleModel> _ConditionList { get; private set; }
public List<MembershipFunction> _NodeMembershipFunction { get; private set; }
public ConditionsVM()
{
_ConditionList = new ObservableCollection<ConditionsRuleModel>();
_NodeMembershipFunction = new List<MembershipFunction>();
List<MembershipFunction> m = new List<MembershipFunction>();
foreach (MembershipFunction mf in ConditionNode.membershipFunctions)
{
m.Add(mf);
}
NodeMembershipFunction = m;
}
public List<MembershipFunction> NodeMembershipFunction
{
get
{
return _NodeMembershipFunction;
}
set
{
if (_NodeMembershipFunction != value)
{
_NodeMembershipFunction = value;
}
}
}
您似乎假设第二个组合框与第一个组合框具有相同的 DataContext。事实并非如此,第二个组合框的 DataContext 是 ConditionList 中的单个元素,即 ConditionRuleModel。
第二个组合框的一种解决方法:
<ComboBox ItemsSource="{Binding DataContext.NodeMembershipFunction, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}, AncestorLevel=2}}"/>
我怀疑您需要将 AncestorLevel 设置为 2,因为 ComboBox 本身也是一个 ItemsCONtrol。不确定祖先查找是否从元素本身开始。
我有一个集合绑定到组合框(主组合框)的 Itemsource。这里面是另一个集合,它绑定到 ItemControl 中的另一个组合框,该组合框从不填充。请帮助
xaml
<ComboBox ItemsSource="{Binding NodeNames}" DisplayMemberPath="name"
SelectedValue="{Binding ConditionalNodeId, Mode=TwoWay}" SelectedValuePath="id">
</ComboBox>
</WrapPanel>
<ItemsControl ItemsSource="{Binding ConditionList}" AlternationCount="{Binding ConditionList.Count}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<WrapPanel>
<ComboBox ItemsSource="{Binding NodeMembershipFunction}">
</ComboBox>
</WrapPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Class代码
public class ConditionsVM : INotifyPropertyChanged
{
public ObservableCollection<ConditionsRuleModel> _ConditionList { get; private set; }
public List<MembershipFunction> _NodeMembershipFunction { get; private set; }
public ConditionsVM()
{
_ConditionList = new ObservableCollection<ConditionsRuleModel>();
_NodeMembershipFunction = new List<MembershipFunction>();
List<MembershipFunction> m = new List<MembershipFunction>();
foreach (MembershipFunction mf in ConditionNode.membershipFunctions)
{
m.Add(mf);
}
NodeMembershipFunction = m;
}
public List<MembershipFunction> NodeMembershipFunction
{
get
{
return _NodeMembershipFunction;
}
set
{
if (_NodeMembershipFunction != value)
{
_NodeMembershipFunction = value;
}
}
}
您似乎假设第二个组合框与第一个组合框具有相同的 DataContext。事实并非如此,第二个组合框的 DataContext 是 ConditionList 中的单个元素,即 ConditionRuleModel。
第二个组合框的一种解决方法:
<ComboBox ItemsSource="{Binding DataContext.NodeMembershipFunction, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}, AncestorLevel=2}}"/>
我怀疑您需要将 AncestorLevel 设置为 2,因为 ComboBox 本身也是一个 ItemsCONtrol。不确定祖先查找是否从元素本身开始。