我有一个ItemsControl,其内联ItemsSource如下(简化):
<UserControl>
<ItemsControl>
<ItemsControl.ItemsSource>
<x:Array Type="y:KeyData">
<y:KeyData Name="Name1"/>
<y:KeyData Name="Name2"/>
</x:Array>
</ItemsControl.ItemsSource>
</ItemsControl>
<ItemsControl.ItemTemplate>
<DataTemplate DataType="{x:Type DateDifferences:KeyData}">
<TextBlock Text="{Binding Name}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</UserControl>
我现在想要将另一个值绑定到每个KeyData项。我尝试过以下方法:
<UserControl>
<ItemsControl>
<ItemsControl.ItemsSource>
<x:Array Type="y:KeyData">
<y:KeyData Name="Name1" Count="{Binding Count1}"/>
<y:KeyData Name="Name2" Count="{Binding Count2}"/>
</x:Array>
</ItemsControl.ItemsSource>
</ItemsControl>
<ItemsControl.ItemTemplate>
<DataTemplate DataType="{x:Type DateDifferences:KeyData}">
<TextBlock Text="{Binding Name}"/>
<TextBlock Text="{Binding Count}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</UserControl>
并设置依赖属性,如下所示:
internal class KeyData : DependencyObject
{
public string Name { get; set; }
public int? Count
{
get { return (int?)GetValue(CountProperty); }
set { SetValue(CountProperty, value); }
}
public static readonly DependencyProperty CountProperty =
DependencyProperty.Register("Count",
typeof(int?),
typeof(KeyData),
new FrameworkPropertyMetadata());
}
并传入数据上下文:
<UserControlName DataContext="{Binding Container.APresenter}"/>
但是,绑定无法找到源...
System.Windows.Data错误:2:找不到管理FrameworkElement或 目标元素的FrameworkContentElement。 BindingExpression:路径=除去;的DataItem = NULL; 目标元素是&#39; KeyData&#39; (的HashCode = 4638229); 目标财产是&#39; Count&#39; (键入&#39; Nullable`1&#39;)
我认为这是依赖属性的重点 - 处理这样的情况?是否有人能指出我误解的部分?
答案 0 :(得分:1)
绑定不知道谁拥有 Count1
和Count2
。提供可能引用相关对象的ElementName
。然后可能处理其DataContext
,例如此绑定:
="{Binding ElementName=PathBox, Path=DataContext.Count1}"
我发现命名Xaml元素(甚至是页面)然后将该命名对象路由到其内部,或者如果它是通过其datacontext的控件解决了大多数绑定问题。
有时必须x:reference才能访问命名项。在这种情况下,根据对象使用x:name命名,然后访问它。
="{Binding Source={x:Reference PathBox} , Path=Count1}">
答案 1 :(得分:0)
所以,最终解决方案。
忽略显而易见的,我最初错过了数据上下文,之后,挑战似乎是让数组中的项目知道外部ItemsControl的数据上下文。
我尝试了ElementName
和RelativeSource
的引用 - 这两者似乎都无法找到。我尝试在UserControl上放置x:Name
,并使用x:Reference
引用,正如OmegaMan在他的回答中所建议的那样。
这些都没有达到预期效果 - 我能找到的唯一可行解决方案是使用"Pipe Object",详见本答复的后半部分。
我已经将数组项重构为一个单独的用户控件,从而简化了绑定。