为什么即使从源获取值,此绑定也无法正常工作?

时间:2012-10-18 11:15:24

标签: wpf binding dependency-properties stackpanel gridviewcolumn

我有这个班级:

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属性。有什么问题?如果对代码有任何疑问,请告诉我,我可以添加

2 个答案:

答案 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,这就是为什么你永远不应该在属性中做那样的逻辑。 (这就是为什么它在自动生成的评论中说“不要修改任何东西”)

在此方案中使用PropertyChangedCallbackhttp://msdn.microsoft.com/en-us/library/ms745795.aspx