我对Polyline类有一个奇怪的问题,它有Points属性。当我在XAML中明确设置Points属性时,它呈现正常,稍后在代码后面,例如我更改第一个点并正确刷新UI。
<Polyline Name="plLine" Points="0 0 100 100 100 200 200 200"
Stroke="Black"
StrokeThickness="1" />
以及后面的代码:
private void Button2_Click(object sender, RoutedEventArgs e)
{
plLine.Points[0] = new Point(10, 10);
}
对此很好。
但是当我使用来自ViewModel的相同数据绑定Points属性时,例如:
<Polyline Name="plLine" Points="{Binding PointCollection}"
Stroke="Black"
StrokeThickness="1" />
并尝试执行我后面的代码,不会刷新渲染的内容。
为什么会出现这种情况?
答案 0 :(得分:2)
你在breaking the binding
。您已经将您的积分绑定到属性PointCollection,然后从您的代码后面设置它,从而覆盖绑定。之后,当您在ViewModel中更改PointCollection时,即使您已为您的类实现了INotifyPropertyChanged,也不会在视图中注意到更改。
你可以试试这个小样本 -
由于通过显式设置文本框的Text属性来破坏绑定。
因此,您应该始终通过其来源设置您的绑定属性。在您的情况下,只需使用INPC设置Viewmodel的属性PointCollection,即可查看视图上的更改。
修改强> 由于它绑定到PointCollection属性,这就是为什么更改集合中的单个值将不会在UI上更新它。您必须通过将绑定设置为新的PointCollection值来完全删除绑定。你不能同时拥有这两个。看看这段代码 -
private void Button_Click(object sender, RoutedEventArgs e)
{
List<Point> pts = new List<Point>();
pts.Add(new Point(20, 20));
pts.Add(new Point(100, 100));
pts.Add(new Point(100, 200));
pts.Add(new Point(200, 200));
this.plLine.Points = new PointCollection(pts);
//this.plLine.SetCurrentValue(Polyline.PointsProperty, new PointCollection(pts));
}
您需要将其完全设置为新集合。如果您希望通过直接设置上面提到的方式来破坏绑定,请取消注释我的最后一行并注释最后一行。这样你的绑定将保持不变。