首页 > 代码库 > 绑定元素属性改变不通知界面
绑定元素属性改变不通知界面
情景假设:绑定的是一个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 YPoint101 {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 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。