【发布时间】:2014-09-29 18:38:51
【问题描述】:
我正在使用具有多个用户定义的依赖属性的自定义控件。我遇到了this question 中描述的相同问题。
我的控件正在其构造函数中设置自定义依赖属性的默认值。当我在DataTemplate 中使用控件时,始终使用在构造函数中设置的值,即使我尝试在 XAML 中设置它。
链接问题的答案解释说,在 C# 代码中设置的值具有更高的优先级,更好的方法是在依赖项属性的元数据中指定默认值。
就我而言,我无法指定默认值,因为依赖属性没有适用于所有情况的单个默认值。默认值依赖于另一个属性,所以我必须在创建控件时而不是在注册属性时查找它们。
这里有一些代码可以帮助说明我的问题:
public partial class MyControl : UserControl
{
public static readonly DependencyProperty MyProperty =
DependencyProperty.Register(
"MyProperty",
typeof(int),
typeof(MyControl),
new FrameworkPropertyMetadata(
int.MinValue,
FrameworkPropertyMetadataOptions.None,
new PropertyChangedCallback("OnMyPropertyChanged")));
public MyControl() : base()
{
InitializeComponent();
this.MyProperty = GetDefaultPropertyValue();
}
public int MyProperty
{
get { return (int)GetValue(MyProperty); }
set { SetValue(MyProperty, value); }
}
private int GetDefaultPropertyValue()
{
// look up the appropriate default based on some other criteria
return 42;
// (in reality, the default value for "MyProperty"
// depends on the value of a "Mode" custom DependencyProperty.
// this is just hard coded for testing)
}
}
XAML 用法如下所示:
<!-- View displays 4 (desired) -->
<local:MyControl MyProperty="4" />
<!-- View displays default of 42 (desired) -->
<local:MyControl />
<!-- View displays default of 42 (wanted 4) -->
<DataTemplate x:Key="MyTemplate">
<local:MyControl MyProperty="4"/>
</DataTemplate>
总结一下:
所需的行为是首先使用来自 XAML 的值。如果 XAML 中未指定该值,那么我想回退到控件构造函数中设置的默认值。
如果我只是将控件直接包含在视图中,我会得到预期的行为。如果控件在DataTemplate 中使用,那么我总是在构造函数中获得默认设置(即使数据模板显式设置了另一个值)。
在模板中使用控件时,还有其他方法可以指定默认值吗?我能想到的唯一选择是将控件分解为几个单独但相似的控件,每个控件都使用使用依赖属性注册的默认值(这消除了基于@987654326 设置默认值的需要@ 属性)。
【问题讨论】:
标签: c# wpf xaml datatemplate