UserControl:我可以在 XAML 中设置自己的 DependencyProperty 吗?
UserControl: Can I set my own DependencyProperty in XAML?
我希望能够做这样的事情:
.xaml.cs:
public partial class MyControl : UserControl
{
public MyControl() => InitializeComponent();
public static readonly DependencyProperty MyTemplateProperty = DependencyProperty.Register(
"MyTemplate", typeof(DataTemplate), typeof(MyControl), new PropertyMetadata(default(DataTemplate)));
public DataTemplate MyTemplate
{
get => (DataTemplate) GetValue(MyTemplateProperty);
set => SetValue(MyTemplateProperty, value);
}
}
.xaml:
<UserControl x:Class="MyControl"> <!-- etc. -->
<Grid />
<!-- does not compile-->
<UserControl.MyTemplate>
<DataTemplate />
</UserControl.MyTemplate>
</UserControl>
但是没用。不足为奇的是,当您以 UserControl
开头元素名称时,编译器仅查找在 UserControl
本身上定义的属性。但是将元素名称更改为 <MyControl.MyTemplate>
(使用正确的名称空间前缀)也不起作用;在这种情况下,编译器会尝试将 MyTemplate
解释为附加的 属性。
除了在资源中定义值然后从代码隐藏将其分配给 属性 之外,还有什么方法可以实现此目的吗?
您可以通过样式设置属性:
<UserControl ...>
<UserControl.Style>
<Style>
<Setter Property="local:MyControl.MyTemplate">
<Setter.Value>
<DataTemplate />
</Setter.Value>
</Setter>
</Style>
</UserControl.Style>
...
</UserControl>
我希望能够做这样的事情:
.xaml.cs:
public partial class MyControl : UserControl
{
public MyControl() => InitializeComponent();
public static readonly DependencyProperty MyTemplateProperty = DependencyProperty.Register(
"MyTemplate", typeof(DataTemplate), typeof(MyControl), new PropertyMetadata(default(DataTemplate)));
public DataTemplate MyTemplate
{
get => (DataTemplate) GetValue(MyTemplateProperty);
set => SetValue(MyTemplateProperty, value);
}
}
.xaml:
<UserControl x:Class="MyControl"> <!-- etc. -->
<Grid />
<!-- does not compile-->
<UserControl.MyTemplate>
<DataTemplate />
</UserControl.MyTemplate>
</UserControl>
但是没用。不足为奇的是,当您以 UserControl
开头元素名称时,编译器仅查找在 UserControl
本身上定义的属性。但是将元素名称更改为 <MyControl.MyTemplate>
(使用正确的名称空间前缀)也不起作用;在这种情况下,编译器会尝试将 MyTemplate
解释为附加的 属性。
除了在资源中定义值然后从代码隐藏将其分配给 属性 之外,还有什么方法可以实现此目的吗?
您可以通过样式设置属性:
<UserControl ...>
<UserControl.Style>
<Style>
<Setter Property="local:MyControl.MyTemplate">
<Setter.Value>
<DataTemplate />
</Setter.Value>
</Setter>
</Style>
</UserControl.Style>
...
</UserControl>