0

カスタム コントロールを作成していて、bindable property. これらのプロパティに基づいて子をセットアップしたかったのです。このシナリオを処理する正しい方法は何ですか? ベース コントロールまたはフックできるイベントでオーバーライドする意味のあるものを探してみました。

たとえば、 andをGrid設定したときにa の列/行定義を作成したいColumnCountRowCountXAML

public class HeatMap: Grid
{
        public HeatMap()
        {
             // Where should I move these?
              Enumerable.Range(1, RowCount)
                .ToList()
                .ForEach(x => RowDefinitions.Add(new RowDefinition() { Height = GridLength.Auto }));
              Enumerable.Range(1, ColumnCount)
                  .ToList()
                  .ForEach(x => ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(1, GridUnitType.Star) }));
        }


        public static readonly BindableProperty RowCountProperty =
            BindableProperty.Create<HeatMap, int>(p => p.RowCount, 0);

        public int RowCount
        {
            get { return (int)GetValue(RowCountProperty); }
            set { SetValue(RowCountProperty, value); }
        }

        public static readonly BindableProperty ColumnCountProperty =
            BindableProperty.Create<HeatMap, int>(p => p.ColumnCount, 0);

        public int ColumnCount
        {
            get { return (int)GetValue(ColumnCountProperty); }
            set { SetValue(ColumnCountProperty, value); }
        }
 }
4

1 に答える 1

1

プロパティが更新されたときに列/行を更新するということですか? 値の更新を処理するBindableProperty.Create引数があります。propertyChanged

public class HeatMap : Grid
{
    public HeatMap()
    {
        // Where should I move these?
        UpdateRows ();
        UpdateColumns ();
    }

    void UpdateColumns ()
    {
        ColumnDefinitions.Clear ();
        Enumerable.Range (1, ColumnCount).ToList ().ForEach (x => ColumnDefinitions.Add (new ColumnDefinition () {
            Width = new GridLength (1, GridUnitType.Star)
        }));
    }

    void UpdateRows ()
    {
        RowDefinitions.Clear ();
        Enumerable.Range (1, RowCount).ToList ().ForEach (x => RowDefinitions.Add (new RowDefinition () {
            Height = GridLength.Auto
        }));
    }

    public static readonly BindableProperty RowCountProperty =
        BindableProperty.Create<HeatMap, int> (p => p.RowCount, 0,
        propertyChanged: (bindable, oldValue, newValue) => ((HeatMap)bindable).UpdateRows ());

    public int RowCount
    {
        get { return (int)GetValue(RowCountProperty); }
        set { SetValue(RowCountProperty, value); }
    }

    public static readonly BindableProperty ColumnCountProperty =
        BindableProperty.Create<HeatMap, int>(p => p.ColumnCount, 0,
        propertyChanged: (bindable, oldValue, newValue) => ((HeatMap)bindable).UpdateColumns ());

    public int ColumnCount
    {
        get { return (int)GetValue(ColumnCountProperty); }
        set { SetValue(ColumnCountProperty, value); }
    }
}
于 2015-06-11T08:46:30.803 に答える