【发布时间】:2017-11-11 18:41:48
【问题描述】:
这是绑定到列的类。我在 ListParts 上设置了一个手表,这些部件确实存在。
private MasksSourceList _MasksSourceListBound;
public MasksSourceList MasksSourceListBound
{
get => _MasksSourceListBound;
set { SetAndNotify(ref _MasksSourceListBound, value, () => MasksSourceListBound); }
}
public class MasksSourceList : ObservableObject
{
private List<MaskDetail> _maskDetails;
public List<MaskDetail> MaskDetails
{
get => _maskDetails;
set { SetAndNotify(ref _maskDetails, value, () => MaskDetails); }
}
private List<Jarvis.Data.Models.Parts> _listParts;
public List<Jarvis.Data.Models.Parts> ListParts
{
get => _listParts;
set { SetAndNotify(ref _listParts, value, () => ListParts); }
}
}
这是显示 DataGrid 的父项源的 XAML。
<DataGrid ItemsSource="{Binding MasksSourceListBound.MaskDetails}" >
我正在展示一个普通的文本列,以证明 DataGrid 的 ItemsSource 绑定正在工作,如附图所示。
<DataGrid.Columns>
<DataGridTextColumn Header="part name" Binding="{Binding PartName}">
</DataGridTextColumn>
<DataGridComboBoxColumn
Header="part name"
ItemsSource="{Binding MasksSourceListBound.ListParts}"
SelectedValueBinding="{Binding PartName, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
SelectedValuePath="PartId"
DisplayMemberPath="PartName"
>
</DataGridComboBoxColumn>
但是为什么组合框列的ItemsSource不能识别ListParts呢?我检查了 PartId 和 PartName 的拼写,它们是正确的。
这是来自输出窗口的错误消息:
System.Windows.Data 错误:2:找不到目标元素的管理 FrameworkElement 或 FrameworkContentElement。 BindingExpression:Path=MasksSourceListBound.ListParts;数据项=空;目标元素是“DataGridComboBoxColumn”(HashCode=64358720);目标属性是“ItemsSource”(类型“IEnumerable”)
我已经尝试过了,但仍然没有结果:
<DataGridComboBoxColumn.ElementStyle>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding MasksViewModel.MasksSourceListBound.ListParts}"/>
</Style>
</DataGridComboBoxColumn.ElementStyle>
<DataGridComboBoxColumn.EditingElementStyle>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding MasksViewModel.MasksSourceListBound.ListParts}"/>
</Style>
</DataGridComboBoxColumn.EditingElementStyle>
使用 DataContext.MasksSourceListBound.ListParts 和适当的相对源等修改上述内容后,跟踪器显示:
System.Windows.Data Warning: 58 : Path: 'DataContext.MasksSourceListBound.ListParts'
System.Windows.Data Warning: 60 : BindingExpression (hash=20088760): Default mode resolved to OneWay
System.Windows.Data Warning: 61 : BindingExpression (hash=20088760): Default update trigger resolved to PropertyChanged
System.Windows.Data Warning: 62 : BindingExpression (hash=20088760): Attach to System.Windows.Controls.DataGridComboBoxColumn+TextBlockComboBox.ItemsSource (hash=46581119)
System.Windows.Data Warning: 66 : BindingExpression (hash=20088760): RelativeSource (FindAncestor) requires tree context
System.Windows.Data Warning: 65 : BindingExpression (hash=20088760): Resolve source deferred
System.Windows.Data Warning: 67 : BindingExpression (hash=5618098): Resolving source
System.Windows.Data Warning: 70 : BindingExpression (hash=5618098): Found data context element: <null> (OK)
这是更正后的 XAML 决定为 DataGrid 显式设置数据上下文以避免 3 部分绑定。但是在中断模式下仍然得到输入字符串的格式不正确。输出表明 RelativeSource (FindAncestor) 需要树上下文:
<DataGrid DataContext="{Binding MasksSourceListBound}" ItemsSource="{Binding MaskDetails}"
<DataGridComboBoxColumn Header="part name" HeaderStringFormat=" {0}" Width="200"
SelectedValueBinding="{Binding PartName, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
SelectedValuePath="PartId"
DisplayMemberPath="PartName">
<DataGridComboBoxColumn.ElementStyle>
<Style TargetType="ComboBox">
<Setter
Property="ItemsSource"
Value="{Binding DataContext.ListParts, RelativeSource={RelativeSource AncestorType=DataGrid}, PresentationTraceSources.TraceLevel=High}"
/>
</Style>
</DataGridComboBoxColumn.ElementStyle>
<DataGridComboBoxColumn.EditingElementStyle>
<Style TargetType="ComboBox">
<Setter
Property="ItemsSource"
Value="{Binding DataContext.ListParts, RelativeSource={RelativeSource AncestorType=DataGrid}, PresentationTraceSources.TraceLevel=High}"
/>
</Style>
</DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>
【问题讨论】:
-
“目标元素”是拥有绑定目标的对象。这里是
DataGridComboBoxColumn。 “找不到目标元素的管理 FrameworkElement 或 FrameworkContentElement。”意味着它没有可视父级来继承DataContext。 It's a common problem with that column type. -
我刚刚测试了使用 ElementStyle 和 EditElementStyle 设置 ItemsSource 那里。尝试寻找祖先来获取父数据上下文。但仍然没有结果。 MasksSourceListBound 位于作为 DataContext 的 MasksViewModel 内。您能否提供示例 XAML?
-
示例 XAML 在我链接的答案中。
MasksViewModel是从哪里来的? -
MasksViewModel 是页面的DataContext。