我正在尝试在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,为什么会这么重要呢?
答案 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属性的第一种方法是正确的。