2012-06-04 41 views
0

無論如何要綁定Line.X2Line.Y2PointXY?現在,當我使用如何將線端點(X2,Y2)綁定到點?

line.DataContext=testPoint; 
line.SetBinding(Line.X2Property,new Binding("X")); 
line.SetBinding(Line.Y2Property,new Binding("Y")); 

它爲一日一次,然後當我改變testPoint.XtestPoint.Y它不會改變。該怎麼辦?

[編輯] 我有很多Lines,甚至它可能會增加,因爲我不能創建Point屬性每個Line

回答

1

綁定需要更新源的更改時間。你可以讓你的Point爲DependencyProperty,或者讓包含Point的類實現INotifyPropertyChanged。請注意,無論哪種方式,您都希望將其作爲屬性公開而不是字段,否則如果直接修改X和Y值,它仍不會更新。當你公開爲屬性,可以使用語法如更新單個值:

TestPoint = new Point(newXvalue, TestPoint.Y); 

此更新單個值,但也觸發任何setter函數如的PropertyChanged。

下面是使用INotifyPropertyChanged的一個簡單的例子:

http://msdn.microsoft.com/en-us/library/ms229614.aspx

和創建自己的DependencyProperty一個簡單的例子:

教學貫徹:

http://www.codeproject.com/Articles/42203/How-to-Implement-a-DependencyProperty

+0

的問題是,我不想將TestPoint設置爲新的Point。我想使用這樣的TestPoint:... TestPoint.X =東西。每次當我想改變X或Y時,都沒有辦法? – Rabi

0

正如Moozhe提到INotifyPropertyChanged和令狀你點EA的包裝特性:

public double X { 
    get { return TestPoint.X; } 
    set { TestPoint.X = value; 
      OnPropertyChanged("X"); 
     } 
} 

同爲Y ...

和事件:

public event PropertyChangedEventHandler PropertyChanged; 

private void OnPropertyChanged(String property) 
{ 
    if (PropertyChanged == null) return; 
    PropertyChanged(this, new PropertyChangedEventArgs(property)); 
} 
+0

你無法理解我。我還提到,如果我有機會,我會繼承它,並且做一些事情,你在上面說過。問題是我有這些「X和Y」組合不止一個I類。因爲我無法實施這個解決方案 – Rabi

+0

,爲什麼你不能? – webber2k6

+0

「我在課堂上有幾個」X和Y「,以及如何實施您的解決方案?對於每一行,我需要添加屬性到我的課程中? – Rabi

0

對於WPF結合工作的測試點必須能夠通知財產的對象變化。如果testPoint沒有實現INotifyPropertyChanged接口,那麼您所看到的行爲是預期的。線端點綁定到原始值並且更改不傳播。 要解決您的第一個問題,請確保testPoint正確實現所需的接口。

要使WPF綁定在對象集合上工作,您必須使用能夠通知集合更改的集合。如果testPoints的集合沒有實現INotifyCollectionChanged接口,那麼您的線端點將被綁定到原始數​​量的對象。 要解決你的第二個問題,請使用ObservableCollection。

我也建議使用XAML來設置綁定而不是代碼。

0
  1. 寫出點的包裝類,它實現INotifyPropertyChanged接口

    public class BindingPoint : INotifyPropertyChanged 
    { 
        private Point point; 
    
        public BindingPoint(double x, double y) 
        { 
         point = new Point(x, y); 
        } 
    
        public double X 
        { 
         get { return point.X; } 
         set 
         { 
          point.X = value; 
          OnPropertyChanged(); 
          OnPropertyChanged("Point"); 
         } 
        } 
    
        public double Y 
        { 
         get { return point.Y; } 
         set 
         { 
          point.Y = value; 
          OnPropertyChanged(); 
          OnPropertyChanged("Point"); 
         } 
        } 
    
        public Point Point 
        { 
         get { return point; } 
        } 
    
        public event PropertyChangedEventHandler PropertyChanged; 
    
        [NotifyPropertyChangedInvocator] 
        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
        { 
         var handler = PropertyChanged; 
         if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); 
        } 
    } 
    
  2. 綁定起始點/端點X和Y屬性排隊

    Line line = new Line(); 
    BindingPoint startPoint = new BindingPoint(0,0); 
    BindingPoint endPoint = new BindingPoint(0,0); 
    
    var b = new Binding("X") 
    { 
        Source = startPoint, 
        Mode = BindingMode.TwoWay 
    }; 
    line.SetBinding(Line.X1Property, b); 
    
    b = new Binding("Y") 
    { 
        Source = startPoint, 
        Mode = BindingMode.TwoWay 
    }; 
    line.SetBinding(Line.Y1Property, b); 
    
    b = new Binding("X") 
    { 
        Source = endPoint, 
        Mode = BindingMode.TwoWay 
    }; 
    line.SetBinding(Line.X2Property, b); 
    
    b = new Binding("Y") 
    { 
        Source = endPoint, 
        Mode = BindingMode.TwoWay 
    }; 
    line.SetBinding(Line.Y2Property, b); 
    
相關問題