2011-08-15 10 views
0

私はWP7のSilverlightプロジェクトを持っています。私はDependencyProjectに基づいて矩形を表示するための 'UserControl'を持っています。WP7 - バインドによるUserControlの更新

さて、私は次のように私のページにコントロールを配置する場合:

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

私は私の矩形は「RectangleCount」の初期値に基づいて表示され得ます。ただし、RectangleCountが変更されると、ユーザーコントロールは更新されません。私はこれがOnLoadedイベントで私の四角形を描いていることが原因だと思っていますが、NumRectangles DPが更新されたときに、コントロールが新しい矩形を描くようにバインドする別のイベントを見つけることができません。

助けが必要ですか?

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

あなたは依存関係プロパティを登録すると、あなたはハンドラを提供する必要がありますあなたのPropertyMetadata内の 'changed'イベントのために。ここでは、MSDNのドキュメントを参照してください:

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

あなたは依存関係プロパティの変更ハンドラとして供給方法は、あなたがあなたのコントロールへの参照を取得するために、このメソッドに渡される引数を使用する必要があるので、静的になります。ここから、UIをクリアして再ビルドできます。

関連する問題