WPF: привязка данных к коллекции PointCollection для пользовательского элемента UIElement - PullRequest
1 голос
/ 28 ноября 2010

Я пытаюсь создать WPF UIElement, который выполняет какой-то особый рендеринг.

Проблема в том, что я не могу заставить работать привязку данных для PointCollection.Внутри OnRender() из GraphElement свойство Points имеет значение null, что не имеет для меня никакого смысла.

class GraphElement : UIElement
{
    public static readonly DependencyProperty PointsProperty = DependencyProperty.Register(
        "Points",
        typeof(PointCollection),
        typeof(GraphElement),
        new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsRender));            

    public PointCollection Points
    {
        get { return (PointCollection)GetValue(PointsProperty); }
        set { SetValue(PointsProperty, value); }
    }

    protected override void OnRender(DrawingContext drawingContext)
    {
        base.OnRender(drawingContext);

        //Points is null
        Debug.Assert(Points != null);
    }

}

class TestViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private PointCollection _viewModelPoints;
    public PointCollection ViewModelPoints
    {
        get { return _viewModelPoints; }
        set
        {
            _viewModelPoints = value;
            if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("ViewModelPoints"));
        }
    }
}

<Window x:Class="TestApp.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:TestApp"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <Canvas>
        <local:GraphElement Points="{Binding Path=ViewModelPoints}"/>
    </Canvas>
</Grid>


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace TestApp
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            var testViewModel = new TestViewModel();
            testViewModel.ViewModelPoints = new PointCollection();
            testViewModel.ViewModelPoints.Add(new Point(0.0, 0.0));
            DataContext = testViewModel;
            InitializeComponent();
        }
    }
}

1 Ответ

2 голосов
/ 28 ноября 2010

Измените наследование на GraphElement с UIElement на FrameworkElement (которое, в свою очередь, наследует UIElement).Здесь у вас есть DataContext dp и т. Д.

class GraphElement : FrameworkElement
{
    //...
}

. Скопируйте ваш код в пример проекта (изменив UIElement на FrameworkElement), и в OnRender Point не имеет значение null.Загрузил проект здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...