Почему эта привязка данных не работает? - PullRequest
4 голосов
/ 16 мая 2009

У меня есть класс ViewModel, который содержит список точек, и я пытаюсь привязать его к полилинии. Полилиния берет начальный список точек, но не замечает, когда добавляются дополнительные точки, даже если я реализую 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"));
    }
}

Ответы [ 3 ]

4 голосов
/ 16 мая 2009

Вполне вероятно, что, поскольку он привязан к коллекции, ему потребуется что-то вроде ObservableCollection<T>. Что произойдет, если вы переключитесь с PointCollection на ObservableCollection<Point>?

1 голос
/ 15 июня 2010

Я получил его для работы в качестве POCO, реализовав INotifyCollectionChanged вместо INotifyPropertyChanged.

1 голос
/ 16 мая 2009

Измените Свойство 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.

Извините, ваш объект должен наследоваться от DependencyObject

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