原文: 綁定元素屬性改變不通知界面
情景假設:綁定的是一個Point,當Point的X或者Y屬性發生改變時,綁定的點也随界面改變
此時界面不會發生改變
原因:當X或者Y屬性發生改變時并沒有觸發Point的Set方法
1 <Grid>
2 <Grid.Resources>
3 <local:PConverter x:Key="converter"/>
4 <local:PointsConverter x:Key="pointsC"/>
5
6 <Style TargetType="Ellipse">
7 <Setter Property="Height" Value="5"/>
8 <Setter Property="Width" Value="5"/>
9 <Setter Property="HorizontalAlignment" Value="Left"/>
10 <Setter Property="VerticalAlignment" Value="Top"/>
11 </Style>
12 </Grid.Resources>
13
14
15 <Grid.ColumnDefinitions>
16 <ColumnDefinition/>
17 <ColumnDefinition/>
18 </Grid.ColumnDefinitions>
19
20
21 <Grid x:Name="PathGrid" Grid.Column="0">
22 <Border BorderBrush="AliceBlue" BorderThickness="5"/>
23
24 <Path Stroke="BlueViolet" StrokeThickness="3">
25 <Path.Data>
26 <PathGeometry>
27 <PathFigure StartPoint="{Binding ElementName=OwnerWindow,Path=StartPoint}">
28 <PathFigure.Segments>
29 <PolyBezierSegment
30 IsSmoothJoin="True"
31 Points="{Binding ElementName=OwnerWindow,Path=Points,Converter={StaticResource pointsC},UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}"/>
32 </PathFigure.Segments>
33 </PathFigure>
34 </PathGeometry>
35 </Path.Data>
36 </Path>
37 </Grid>
38
39 <StackPanel Grid.Column="1">
40 <StackPanel>
41 <Label>請輸入StartPoint坐标</Label>
42 <StackPanel Orientation="Horizontal">
43 <Label>X:</Label>
44 <TextBox Width="50" Text="{Binding ElementName=OwnerWindow,Path=XStartPoint,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}"/>
45 <Label>Y:</Label>
46 <TextBox Width="50" Text="{Binding ElementName=OwnerWindow,Path=YStartPoint,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}"/>
47 </StackPanel>
48 </StackPanel>
49 <StackPanel>
50 <Label>請輸入EndPoint坐标</Label>
51 <StackPanel Orientation="Horizontal">
52 <Label>X:</Label>
53 <TextBox Width="50" Text="{Binding ElementName=OwnerWindow,Path=XEndPoint,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}"/>
54 <Label>Y:</Label>
55 <TextBox Width="50" Text="{Binding ElementName=OwnerWindow,Path=YEndPoint,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}"/>
56 </StackPanel>
57 </StackPanel>
58 <StackPanel>
59 <Label>請輸入路線經過的坐标點</Label>
60 <StackPanel Orientation="Horizontal">
61 <Label>X:</Label>
62 <TextBox Width="50" Text="{Binding ElementName=OwnerWindow,Path=XPoint,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}"/>
63 <Label>Y:</Label>
64 <TextBox Width="50" Text="{Binding ElementName=OwnerWindow,Path=YPoint,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}"/>
65 <Button Height="20" Click="Button_Click">增加</Button>
66 </StackPanel>
67 </StackPanel>
68
69 <ListBox Height="100"
70 ItemsSource="{Binding ElementName=OwnerWindow,Path=Points}"/>
71 </StackPanel>
72 </Grid>
1 private ObservableCollection<Point> points = new ObservableCollection<Point>();
2
3 public ObservableCollection<Point> Points
4 {
5 get { return points; }
6 set{points = value;}
7 }
8
9
10
11
12
13
14 public Point StartPoint
15 {
16 get { return (Point)GetValue(StartPointProperty); }
17 set { SetValue(StartPointProperty, value); }
18 }
19
20 // Using a DependencyProperty as the backing store for StartPoint. This enables animation, styling, binding, etc...
21 public static readonly DependencyProperty StartPointProperty =
22 DependencyProperty.Register("StartPoint", typeof(Point), typeof(PathAnimationDemo), new PropertyMetadata(new Point(0, 0)));
23
24
25
26 public Point EndPoint
27 {
28 get { return (Point)GetValue(EndPointProperty); }
29 set
30 {
31 SetValue(EndPointProperty, value);
32 this.OnPropertyChanged("EndPoint");
33 }
34 }
35
36 // Using a DependencyProperty as the backing store for EndPoint. This enables animation, styling, binding, etc...
37 public static readonly DependencyProperty EndPointProperty =
38 DependencyProperty.Register("EndPoint", typeof(Point), typeof(PathAnimationDemo), new PropertyMetadata(new Point(100, 100)));
39
40 private double xStartPoint;
41
42 public double XStartPoint
43 {
44 get { return this.StartPoint.X; }
45 set
46 {
47 xStartPoint = value;
48 this.StartPoint = new Point(xStartPoint, this.StartPoint.X);
49 }
50 }
51
52
53 private double yStartPoint;
54
55 public double YStartPoint
56 {
57 get { return this.StartPoint.Y; }
58 set
59 {
60 yStartPoint = value;
61 this.StartPoint = new Point(this.StartPoint.X, yStartPoint);
62 }
63 }
64
65 private double xEndPoint;
66
67 public double XEndPoint
68 {
69 get { return this.EndPoint.X; }
70 set
71 {
72 xEndPoint = value;
73 this.EndPoint = new Point(xEndPoint, this.EndPoint.Y);
74 }
75 }
76
77 private double yEndPoint;
78
79 public double YEndPoint
80 {
81 get { return this.EndPoint.Y; }
82 set
83 {
84 yEndPoint = value;
85 this.EndPoint = new Point(this.EndPoint.X, yEndPoint);
86 }
87 }
88
89
90 private double xPoint;
91
92 public double XPoint
93 {
94 get { return xPoint; }
95 set { xPoint = value; }
96 }
97
98 private double yPoint;
99
100 public double YPoint
101 {
102 get { return yPoint; }
103 set { yPoint = value; }
104 }
105
106
107
108
109 public PathAnimationDemo()
110 {
111 this.SetPoints(this.points);
112 InitializeComponent();
113
114 }
115
116 private void SetPoints(ObservableCollection<Point> myPointCollection)
117 {
118 points.Add(new Point(50, 100));
119 myPointCollection.Add(new Point(100, 50));
120 myPointCollection.Add(new Point(200, 100));
121 myPointCollection.Add(new Point(100, 200));
122 myPointCollection.Add(new Point(400, 400));
123 myPointCollection.Add(new Point(600, 600));
124 }
125
126 public event PropertyChangedEventHandler PropertyChanged;
127
128 private void OnPropertyChanged(string propertyName)
129 {
130 if (PropertyChanged != null)
131 {
132 PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
133 }
134 }
135
136 private void Button_Click(object sender, RoutedEventArgs e)
137 {
138 this.points.Add(new Point(this.xPoint, this.YPoint));
139 this.Points = this.points;
140 }
141
142 }