Вопрос по шаблону MVVM на WPF? - PullRequest
1 голос
/ 11 марта 2010

У меня есть пользовательский элемент управления, скажем, UC1 . Этот пользовательский элемент управления имеет viewmodel UC1_vm.

В пользовательском контроле UC1 у меня есть холст, в котором реализована логика рисования кривой. Эта логика кривой рисования основана на свойстве точек данных в модели представления (UC1_vm).

Свойство точек данных внутри модели представления изменяется с другим условием. Генерация точек данных записана в модели представления.

Я хочу связать свойство точек данных в модели представления с логикой рисования кривой внутри пользовательского элемента управления (представление). Я хочу, чтобы всякий раз, когда свойство точки данных изменялось в модели представления, холст вызывает метод рисования кривой.

Могу ли я установить для свойства set любое свойство canvas, которое при изменении автоматически вызывает логику on paint?

Пожалуйста, предложите мне подход к реализации этого сценария !!

Ответы [ 2 ]

0 голосов
/ 13 марта 2010

Похоже, у вас есть DependencyProperty, который представляет собой набор точек в вашем UserControl. При регистрации используйте метаданные FrameworkPropertyMetadata и укажите FrameworkPropertyMetadataOptions.AffectsRender в конструкторе метаданных. Обратите внимание, что это будет работать только в том случае, если будет заменена вся коллекция (если вы вызовете PropertyChanged для коллекции, но экземпляр коллекции не изменился, ваша краска все равно не будет вызвана).

Если ваша коллекция реализует INotifyCollectionChanged, то вы можете подключить обработчик события, измененного коллекцией, который делает недействительным визуальный элемент:

public static DependencyProperty PointsProperty = DependencyProperty.Register(
    "Points",
    typeof(IEnumerable<Point>),
    typeof(UC1),
    new FrameworkPropertyMetadata(null, 
        FrameworkPropertyMetadataOptions.AffectsRender,
        OnPointsChanged));

public IEnumerable<Point> Points
{
    get { return (IEnumerable<Point>)GetValue(PointsProperty); }
    set { SetValue(PointsProperty, value); }
}

private static void OnPointsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    UC1 ctrl = d as UC1;
    if (e.NewValue != null && e.NewValue is INotifyCollectionChanged)
        ((INotifyCollectionChanged)e.NewValue).CollectionChanged += ctrl.PointsChanged;

    if (e.OldValue != null && e.OldValue is INotifyCollectionChanged)
        ((INotifyCollectionChanged)e.OldValue).CollectionChanged -= ctrl.PointsChanged;
}

private void PointsChanged(object sender, NotifyCollectionChangedEventArgs e)
{
    InvalidateVisual();
}
0 голосов
/ 11 марта 2010

РЕДАКТИРОВАТЬ : Спасибо @Ray Burns за довольно правильный балл!

Если ваш список реализует интерфейс INotifyCollectionChanged (например, ObservableCollection<Point>, см. ObservableCollection @ msdn ) или объекты реализуют INotifyPropertyChanged (см. INotifyPropertyChanged @ msdn ) и вы привязывать точки к представлению, тогда он должен разобраться сам (конечно, если привязка верна!)

Я упоминаю, что, поскольку вы указали, что используете Список, который в зависимости от того, как все настроено, может работать один раз, но никогда не обновляется.

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

ПК: -)

...