绑定到ItemsControl中的依赖项属性

时间:2015-04-08 16:01:38

标签: wpf dependency-properties xaml-binding

我有一个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;)

我认为这是依赖属性的重点 - 处理这样的情况?是否有人能指出我误解的部分?

2 个答案:

答案 0 :(得分:1)

绑定不知道谁拥有 Count1Count2。提供可能引用相关对象的ElementName。然后可能处理其DataContext,例如此绑定:

="{Binding ElementName=PathBox, Path=DataContext.Count1}"

我发现命名Xaml元素(甚至是页面)然后将该命名对象路由到其内部,或者如果它是通过其datacontext的控件解决了大多数绑定问题。

更新

有时必须x:reference才能访问命名项。在这种情况下,根据对象使用x:name命名,然后访问它。

="{Binding Source={x:Reference PathBox} , Path=Count1}">

答案 1 :(得分:0)

所以,最终解决方案。

忽略显而易见的,我最初错过了数据上下文,之后,挑战似乎是让数组中的项目知道外部ItemsControl的数据上下文。

我尝试了ElementNameRelativeSource的引用 - 这两者似乎都无法找到。我尝试在UserControl上放置x:Name,并使用x:Reference引用,正如OmegaMan在他的回答中所建议的那样。

这些都没有达到预期效果 - 我能找到的唯一可行解决方案是使用"Pipe Object",详见本答复的后半部分。

我已经将数组项重构为一个单独的用户控件,从而简化了绑定。