XAML 绑定自定义控件中的数据

eivgtgni  于 2022-12-16  发布在  其他
关注(0)|答案(2)|浏览(196)

我有一个自定义控件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)

9fkzdhlc

9fkzdhlc1#

绑定不起作用

依赖项属性是 * 在控件本身上定义的 *。没有显式源的常规绑定使用当前DataContext。为了使绑定工作,必须将DataContext设置为控件本身。虽然可以在构造函数中使用DataContext=this;执行此操作,但不应执行此操作,否则,自定义控件将不会从父控件继承其数据上下文。
您应该做的是在绑定中指定控件作为源。您可以通过将x:Name分配给控件,然后使用ElementName引用它来完成此操作。

<UserControl ...
             x:Name="This">
    <Grid>
       <ComboBox SomeProperty="{Binding customId, ElementName=This}"
                 .../>
   </Grid>
</UserControl>

或者,可以指定具有自定义控件类型的RelativeSource

<ComboBox SomeProperty="{Binding customId, RelativeSource={RelativeSource AncestorType=local:myCustomControl}}"
          .../>

依赖关系属性定义

依赖项属性定义错误。

  • 依赖项属性必须符合模式<Name>Property,并且其 Package 属性必须命名为<Name>。 Package 属性的名称(* 而不是 * 依赖项属性)将作为第一个参数传递。尽管这在您的具体方案中不起作用,但以后会导致问题。
  • 所有者类型必须是定义dependecy属性的控件的类型。此处为typeof(myClass),但必须为typeof(myCustomControl)

总而言之,dependecy属性应该像这样声明:

public static readonly DependencyProperty customIdProperty = DependencyProperty.Register(
   nameof(customId), typeof(string), typeof(myCustomControl),
   new FrameworkPropertyMetadata(string.Empty, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));

关于命名的另一个注意事项。在C#中,你应该遵守Pascal-Casing对类(因此控件)和属性的定义。Pascal-Casing的标识符以大写字母开头,例如MyCustomControlCustomIdPropertyCustomId

tyg4sfes

tyg4sfes2#

nameof(customIdProperty)替换为nameof(customId),将typeof(myClass)替换为typeof(myCustomControl)

相关问题