【发布时间】:2015-05-02 13:40:04
【问题描述】:
再次遇到一个(可能)简单的问题。
我想创建一个自定义 UIElement(保持正交的线条集合)。 此 UIElement 在我的 MVVM 应用程序中用作视图。
这是我的代码:
class RaOrthogonalLine : Canvas, INotifyPropertyChanged
{
public RaOrthogonalLine()
{
Points.CollectionChanged += Points_CollectionChanged;
}
void Points_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
Paint();
}
void Paint()
{
//PaintingStuff! Here I would like to get in!
}
void newLine_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
if (LineClicked != null)
LineClicked(sender, e);
}
public delegate void LineClickedEventHandler(object sender, MouseButtonEventArgs e);
public event LineClickedEventHandler LineClicked;
public ObservableCollection<RaPoint> Points
{
get
{
return (ObservableCollection<RaPoint>)GetValue(PointsProperty);
}
set
{
SetValue(PointsProperty, value);
RaisePropertyChanged("Points");
}
}
public static readonly DependencyProperty PointsProperty = DependencyProperty.Register("Points", typeof(ObservableCollection<RaPoint>), typeof(RaOrthogonalLine),
new FrameworkPropertyMetadata(new ObservableCollection<RaPoint>(), new PropertyChangedCallback(PointsPropertyChanged))
{
BindsTwoWayByDefault = true,
DefaultUpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged
}
);
private static void PointsPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
RaOrthogonalLine thisLine = (RaOrthogonalLine)d;
thisLine.Paint();
}
public event PropertyChangedEventHandler PropertyChanged;
protected void RaisePropertyChanged(string name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}
}
在我的 XAML 中,我将 ViewModel 的 ObservableCollection 绑定到 UIElement(View) 中的 ObservableCollection。
效果很好。
我现在的问题是当集合更改(添加/删除/..)时我没有收到通知 - 因为那时我需要重新绘制它。
我试图获取 Points.CollectionChanged 事件,但它没有触发。
有人有想法吗?
谢谢!
【问题讨论】:
-
WPF中没有“Paint”之类的东西,你的代码都是错误的。删除所有内容并使用
ItemsControl。开始阅读here。
标签: c# wpf mvvm observablecollection uielement