我有一个自定义控件myCustomControl.Xaml
<UserControl.Resources>
...
</UserControl.Resources>
<ComboBox Name="myCustomComboBoxParent"
someId = "{Binding customId}"
.../>
以及一个cs文件myCustomControl.xaml.cs
public static readonly DependencyProperty customIdProperty = DependencyProperty.Register(
nameof(customIdProperty), typeof(string), typeof(myClass),
new FrameworkPropertyMetadata(
"", FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
public string customId
{
get { return (string)GetValue(customIdProperty); }
set { SetValue(customIdProperty, value); }
}
然后得到mainPage.xaml
,其中我设置了customId
<local:customComboBox x:Name="myCustomComboBoxChild1" customId = "someIdToBeSended" .../>
我不明白为什么我的customId
没有从mainPage.xaml
发送到myCustromControl.xaml
?我做错了什么?(ComboBox
没有ID)
2条答案
按热度按时间9fkzdhlc1#
绑定不起作用
依赖项属性是 * 在控件本身上定义的 *。没有显式源的常规绑定使用当前
DataContext
。为了使绑定工作,必须将DataContext
设置为控件本身。虽然可以在构造函数中使用DataContext=this;
执行此操作,但不应执行此操作,否则,自定义控件将不会从父控件继承其数据上下文。您应该做的是在绑定中指定控件作为源。您可以通过将
x:Name
分配给控件,然后使用ElementName
引用它来完成此操作。或者,可以指定具有自定义控件类型的
RelativeSource
。依赖关系属性定义
依赖项属性定义错误。
<Name>Property
,并且其 Package 属性必须命名为<Name>
。 Package 属性的名称(* 而不是 * 依赖项属性)将作为第一个参数传递。尽管这在您的具体方案中不起作用,但以后会导致问题。typeof(myClass)
,但必须为typeof(myCustomControl)
。总而言之,dependecy属性应该像这样声明:
关于命名的另一个注意事项。在C#中,你应该遵守Pascal-Casing对类(因此控件)和属性的定义。Pascal-Casing的标识符以大写字母开头,例如
MyCustomControl
,CustomIdProperty
和CustomId
。tyg4sfes2#
将
nameof(customIdProperty)
替换为nameof(customId)
,将typeof(myClass)
替换为typeof(myCustomControl)