0

私はこの独自のクラスを持っています:

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プロパティに設定されていません。問題は何ですか?PSコードについて質問がある場合は、教えてください。追加できます

4

2 に答える 2

0

addCollectionsToStackPanel()バインディングが発生したときに呼び出されません。バインディングエンジンはSetValue直接使用するため、プロパティでそのようなロジックを実行しないでください。(そのため、自動生成されたコメントに「何も変更しないでください」と表示されます)

PropertyChangedCallbackこのシナリオにはを使用します:http: //msdn.microsoft.com/en-us/library/ms745795.aspx

于 2012-10-18T12:52:18.923 に答える
0

@MrDosu が提案したように、DependencyProperty で PropertyChangedCallback を使用します。Callback が静的であるという問題は、呼び出しで 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 スニペットはリソース内のコントロール テンプレートではありません。

于 2012-10-18T12:23:36.750 に答える