我有这个班级:
public class PeriodContainerPanel:StackPanel
{
public PeriodContainerPanel()
: base()
{
addCollectionsToStackPanel();
}
private void addCollectionsToStackPanel()
{
this.Children.Clear();
if (PeriodsList!=null)
{
double minutes = PeriodsList.Count * (Properties.Settings.Default.EndTimeSpan - Properties.Settings.Default.StartTimeSpan).TotalMinutes;
foreach (ObservableCollection<PeriodBase> lst in PeriodsList)
{
this.Children.Add(new ChartUserControl(lst) { Minutes = minutes });
}
}
}
public List<ObservableCollection<PeriodBase>> PeriodsList
{
get { return (List<ObservableCollection<PeriodBase>>)GetValue(PeriodsListProperty); } //do NOT modify anything in here
set { SetValue(PeriodsListProperty, value); addCollectionsToStackPanel(); } //...or here
}
public static readonly DependencyProperty PeriodsListProperty =
DependencyProperty.Register(
"PeriodsList", //Must be the same name as the property created above
typeof(List<ObservableCollection<PeriodBase>>), //Must be the same type as the property created above
typeof(PeriodContainerPanel), //Must be the same as the owner class
new UIPropertyMetadata(
null //default value, must be of the same type as the property
));
}
我在DependencyProperty
中使用此PeriodList
UserControl
,如下所示:
<GridViewColumn>
<GridViewColumn.CellTemplate>
<DataTemplate>
<UI:PeriodContainerPanel PeriodsList="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=DataContext}" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
我检查Convertor
是否有任何获取过程(如果有值)是有值且它是正确的,但它没有设置为PeriodsList
属性。有什么问题?如果对代码有任何疑问,请告诉我,我可以添加
答案 0 :(得分:0)
正如@MrDosu建议的那样,在DependencyProperty上使用PropertyChangedCallback。 回调是静态的问题并不是什么大问题,因为你将在调用中获得对DependencyObject的引用:
private static void ValueChangedCallBack(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
((MyCustomControl)d).RaiseMyValueChanged(); //Where RaiseMyValueChanged is a private non-static method.
}
你对TemplatedParent和Path = DataContext的使用也很奇怪。 路径应该是指一个属性。 在定义样式和/或控件模板时使用TemplatedParent,您的XAML片段不是资源中的控件模板,对吗?
答案 1 :(得分:0)
addCollectionsToStackPanel()
。绑定引擎直接使用SetValue
,这就是为什么你永远不应该在属性中做那样的逻辑。 (这就是为什么它在自动生成的评论中说“不要修改任何东西”)
在此方案中使用PropertyChangedCallback
:http://msdn.microsoft.com/en-us/library/ms745795.aspx