我正在尝试将View中的ListBox
绑定到ViewModel中的类。我在主视图中绑定它没有问题。但是当我尝试在其他XAML视图中进行一些绑定时,我收到以下错误。这有什么问题?
System.Windows.Data错误:4:无法找到与引用'RelativeSource FindAncestor绑定的源,AncestorType ='OutlookCalendar.Controls.OpenSummaryLine',AncestorLevel ='1''。 BindingExpression:路径= SummaryLines;的DataItem = NULL; target元素是'ListBox'(Name =''); target属性是'ItemsSource'(类型'IEnumerable')
<ListBox Grid.Row="6"
Grid.ColumnSpan="3"
Background="White"
Margin="5,0,22,5"
ItemsSource="{Binding SummaryLines,
RelativeSource={RelativeSource AncestorType={x:Type local:OpenSummaryLine}}}"
IsSynchronizedWithCurrentItem="True" />
答案 0 :(得分:1)
如果源与相关RelativeSource Binding
的控件不相关(或更准确地说,是父项),则无法使用Binding
。来自MSDN上的Binding.RelativeSource
Property页:
通过指定绑定源相对于绑定目标位置的位置来获取或设置绑定源。
因此,如果您所需的来源与相关Binding
的控件无关,您将收到错误,这基本上意味着:
无法找到与
OpenSummaryLine
相关的ListBox Binding
元素。
一个简单的解决方案是将源集合移动到公共父集合,将您设置为MainWindow.DataContext
属性的对象作为最可能的目标。如果您将<{1}}属性添加到 对象中,那么您可以使用SummaryLines
从RelativeSource Binding
中显示的每个控件访问它em>,直接或间接地在MainWindow
s:
UserControl
当然,此处使用的<ListBox Grid.Row="6" Grid.ColumnSpan="3" Background="White" Margin="5,0,22,5"
ItemsSource="{Binding DataContext.SummaryLines, RelativeSource={RelativeSource
AncestorType={x:Type local:MainWindow}}}"
IsSynchronizedWithCurrentItem="True" />
XAML命名空间前缀必须引用local
声明的程序集才能使其正常工作。您也可以在MainWindow
视图中使用相同的Binding.Path
,它会将数据绑定到相同的集合。
答案 1 :(得分:0)
在RelativeSource
中使用ElementName
或Binding
时,您绑定的是对象而不是对象的数据上下文。为此,您需要在绑定路径前添加&#39; DataContext&#39;。试试这个:
ItemsSource="{Binding DataContext.SummaryLines,
RelativeSource={RelativeSource AncestorType={x:Type local:OpenSummaryLine}}}"