2010-11-28 59 views
1

我正在尝试使WPF UIElement做一些特殊的渲染。WPF:DataBinding自定义UIElement的PointCollection

问题是我无法使数据绑定工作于PointCollection。在GraphElementOnRender()内,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(); 
     } 
    } 
} 

回答

2

变化从UIElementFrameworkElementGraphElement继承(它继而继承UIElement)。这是你有DataContext DP等

class GraphElement : FrameworkElement 
{ 
    //... 
} 

复制你的代码示例项目(改变的UIElement到FrameworkElement的)和积分不为空的OnRender方法。上传了项目here

+0

我试过了,它没有工作。 – 2010-11-28 17:15:27