WP7 - Обновление UserControl через привязку - PullRequest
0 голосов
/ 16 августа 2011

У меня есть проект WP7 silverlight.У меня есть 'UserControl' для отображения прямоугольников на основе DependencyProject.

Теперь, когда я размещаю элемент управления на своей странице со следующим:

<uc:RectangleControl NumRectangles={Binding Path=RectangleCount,Mode=OneWay} />

Я получаю свои прямоугольники, отображаемые на основеначальное значение 'RectangleCount'.Однако при изменении RectangleCount пользовательский элемент управления никогда не обновляется.Я ожидаю, что это вызвано тем, что я рисую свои прямоугольники в событии OnLoaded, но я не могу найти еще одно событие для привязки, чтобы заставить элемент управления рисовать новые прямоугольники при обновлении DP NumRectangles.

Любая помощь?

UserControl XAML:

<UserControl x:Class="WP7Test.Controls.RectangleControl"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    d:DesignHeight="80" d:DesignWidth="480">

    <Canvas x:Name="canvas" 
            Height="{Binding Height}" Width="{Binding Width}">

    </Canvas>
</UserControl>

А в коде я добавляю прямоугольники на основе свойства зависимости:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

namespace WP7Test.Controls
{

    public partial class RectangleControl : UserControl
    {

        private double RectangleSpacing = 1;


        #region Dependency Properties




        public int NumRectangles
        {
            get { return (int)GetValue(NumRectanglesProperty); }
            set { SetValue(NumRectanglesProperty, value); }
        }

        // Using a DependencyProperty as the backing store for NumRectangles.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty NumRectanglesProperty =
            DependencyProperty.Register("NumRectangles", typeof(int), typeof(RectangleControl), new PropertyMetadata(5));


        #endregion

        public RectangleControl()
        {
            InitializeComponent();

            Loaded += new RoutedEventHandler(OnLoaded);
        }

        private void OnLoaded(object sender, RoutedEventArgs args)
        {

        double rectangleWidth = 20;
double rectangleHeight = 20;
double x = 0;
double y = 0;

            for (int i = 0; i < NumRectangles; i++)
            {
                Brush b = new SolidColorBrush(Colors.Red);


                Rectangle r = GenerateRectangle(x, y, rectangleWidth, rectangleHeight, b);
                canvas.Children.Add(r);

                x += rectangleWidth + 1;
            }


        }

        public Rectangle GenerateRectangle(double x, double y, double width, double height, Brush brush)
        {
            Rectangle r = new Rectangle();
            r.Height = height;
            r.Width = width;
            r.Fill = brush;
            Canvas.SetLeft(r, x);
            Canvas.SetTop(r, y);
            return r;
        }
    }
}

1 Ответ

1 голос
/ 16 августа 2011

Когда вы регистрируете свойство зависимостей, вам необходимо предоставить обработчик для события «преображенного» в свойстве PropertyMetadata. См. Документацию MSDN здесь:

http://msdn.microsoft.com/en-us/library/ms557330%28VS.95%29.aspx

Метод, который вы предоставляете в качестве обработчика изменения свойства зависимости, будет статическим, поэтому вам нужно использовать аргументы, передаваемые этому методу, для получения ссылки на ваш элемент управления. Отсюда вы можете очистить и восстановить свой пользовательский интерфейс.

...