2009-05-15 47 views
4

ポイントのリストを含むViewModelクラスがあり、それをポリラインにバインドしようとしています。 Polylineは最初のポイントリストを取得しますが、INotifyPropertyChangedを実装しても追加ポイントが追加されたときには通知しません。どうしましたか?なぜこのデータバインディングは機能しませんか?

<StackPanel> 
    <Button Click="Button_Click">Add!</Button> 
    <Polyline x:Name="_line" Points="{Binding Pts}" Stroke="Black" StrokeThickness="5"/> 
</StackPanel> 

C#の方:

// code-behind 
_line.DataContext = new ViewModel(); 
private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    // The problem is here: NOTHING HAPPENS ON-SCREEN! 
    ((ViewModel)_line.DataContext).AddPoint(); 
} 

// ViewModel class 
public class ViewModel : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    public PointCollection Pts { get; set; } 

    public ViewModel() 
    { 
     Pts = new PointCollection(); 
     Pts.Add(new Point(1, 1)); 
     Pts.Add(new Point(11, 11)); 
    } 

    public void AddPoint() 
    { 
     Pts.Add(new Point(25, 13)); 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs("Pts")); 
    } 
} 
+0

回答が更新され、原因が見つかりました。 – Carlo

答えて

1
は、依存関係プロパティにごPointCollectionsプロパティを変更

public PointCollection Pts 
     { 
      get { return (PointCollection)GetValue(PtsProperty); } 
      set { SetValue(PtsProperty, value); } 
     } 

     // Using a DependencyProperty as the backing store for Pts. This enables animation, styling, binding, etc... 
     public static readonly DependencyProperty PtsProperty = 
      DependencyProperty.Register("Pts", typeof(PointCollection), typeof(ViewModel), new UIPropertyMetadata(new PointCollection())); 

がところでこれを行うには、PropertyChangedイベントを起動する必要はありません。

申し訳ありませんああ、あなたのオブジェクトは、私はそれがINotifyCollectionChanged代わりにINotifyPropertyChangedのを実装することにより、POCOとして動作するようになったのDependencyObject

public class ViewModel : DependencyObject 
{ 
//... 
} 
+0

通常、DepotencyObjectsとしてViewModelを実装することはお勧めしません.POCOはINotifyPropertyChangedを実装するよりも重いです...とにかく、何も変更しません。 –

+0

ありがとう、答えをテストしましたか? INotifyPropertyChangedを使用すると、ポイントコレクションではなく、他のプロパティに使用するときに私の仕事ができます。 – Qwertie

+0

ええ、Pts.Add(新しいポイント(25,13))の代わりにポイントを作成するときにコードを変更しました。私はPts.Add(新しい点(random.Next(0,100)、random.Next(0,100)))を追加しました。すべての新しいランダムな点が作成され、画面に表示されました。おかげさまで – Carlo

4

コレクションに結合されているので、それはObservableCollection<T>ようなものが必要になる可能性が極めて高いです。 PointCollectionからObservableCollection<Point>に切り替えるとどうなりますか?

+0

同じシナリオを試しただけで、バインディング自体が機能します(Pointsプロパティに新しいポイントが含まれています)...何らかの理由でPolyLineが更新されません –

+0

非常に面白い、Thomas。 – Qwertie

+0

ObservableCollection は機能しません。最初の行は画面に表示されません。明らかにPolylineはObservableCollection へのバインディングをサポートしておらず、List もサポートしていません。 – Qwertie

1

から継承する必要があります。

関連する問題