如何解决RelativeSource绑定错误

时间:2014-08-08 13:58:51

标签: c# wpf xaml binding

我正在尝试将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" />

2 个答案:

答案 0 :(得分:1)

如果源与相关RelativeSource Binding的控件不相关(或更准确地说,是父项),则无法使用Binding。来自MSDN上的Binding.RelativeSource Property页:

  

通过指定绑定源相对于绑定目标位置的位置来获取或设置绑定源。

因此,如果您所需的来源与相关Binding的控件无关,您将收到错误,这基本上意味着:

  

无法找到与OpenSummaryLine相关的ListBox Binding元素。

一个简单的解决方案是将源集合移动到公共父集合,将您设置为MainWindow.DataContext属性的对象作为最可能的目标。如果您将<{1}}属性添加到 对象中,那么您可以使用SummaryLinesRelativeSource 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中使用ElementNameBinding时,您绑定的是对象而不是对象的数据上下文。为此,您需要在绑定路径前添加&#39; DataContext&#39;。试试这个:

ItemsSource="{Binding DataContext.SummaryLines, 
                               RelativeSource={RelativeSource AncestorType={x:Type local:OpenSummaryLine}}}"