Windows Phone - DependencyProperties

时间:2011-04-19 15:43:51

标签: silverlight data-binding windows-phone-7 dependency-properties datacontext

我正在尝试在Windows Phone 7中使用UserControl。我有一些我想要绑定的属性,但无论是否将它们添加为DependencyProperties,它们都不会填充。我可以让它们工作的唯一方法是设置DataContext。我试过的代码是(对于一个属性):

public static readonly DependencyProperty MaximumItemsProperty = DependencyProperty.Register("MaximumItems", typeof(int), typeof(ManageIngredientsControl), new PropertyMetadata(0));
        /// <summary>
        /// Gets or sets the maximum number of items to match.
        /// </summary>
        /// <value>The maximum number of items to match.</value>
        public int MaximumItems
        {
            get { return Convert.ToInt32(base.GetValue(MaximumItemsProperty)); }
            set { base.SetValue(MaximumItemsProperty, value); }
        }

<TextBox Grid.Row="1" Grid.Column="1" x:Name="nudMaxIngredients" Width="120" Text="{Binding MaximumItems,Mode=TwoWay,ElementName=root}" InputScope="Number" />

根UserControl元素称为“root”,但未填充该值。使其工作一半的唯一方法是使用:

public int MaximumItems
{
    get { return Convert.ToInt32(DataContext) }
    set { DataContext =  value; }
}

似乎有些东西干扰了DataContext,但如果我绑定到DependencyProperties,为什么会这么重要呢?

1 个答案:

答案 0 :(得分:2)

我猜你的TextBox在你的UserControl里面。如果是这样,那么ElementName绑定就会出现问题,如here所述。

基本上,你在其XAML中为UserControl提供的名称会被使用它的任何名称覆盖(即在你的页面中)。

解决方法是使用类似的东西:

<TextBox Grid.Row="1" Grid.Column="1" x:Name="nudMaxIngredients" Width="120" Text="{Binding Parent.MaximumItems,Mode=TwoWay,ElementName=LayoutRoot}" InputScope="Number" />

其中LayoutRoot是UserControl的XAML中的根控件。

此外,您对MaximumItems属性的第一种方法是正确的。