0

とにかくバインドLine.X2Line.Y2Point'sXとに接続することはありYますか?今のところ、私が使用するとき

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

それは初めて動作し、それから私が変更したとき、testPoint.Xまたは変更testPoint.Yしないとき。何をすべきか?

[編集] 私はたくさん持っています、Linesそしてそれでさえ私はPointそれぞれのためのプロパティを作成することができないので、それが増えるかもしれませんLine

4

4 に答える 4

1

ソースが変更された場合に備えて、バインディングを更新する必要があります。Point を DependencyProperty にするか、Point を含むクラスに INotifyPropertyChanged を実装することができます。どちらの方法でも、フィールドではなくプロパティとして公開することに注意してください。そうしないと、X 値と Y 値を直接変更しても更新されないからです。プロパティとして公開すると、次のような構文を使用して単一の値を更新できます。

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

これにより、単一の値が更新されますが、PropertyChanged などのセッター関数もトリガーされます。

INotifyPropertyChanged を使用する簡単な例を次に示します。

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

独自の DependencyProperty を作成するための短い例:

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

于 2012-06-04T05:45:39.080 に答える
0

WPF バインディングが機能するには、testPoint がプロパティの変更を通知できるオブジェクトである必要があります。testPoint が INotifyPropertyChanged インターフェイスを実装していない場合、表示されている動作は予期されたものです。ライン エンドポイントは元の値にバインドされ、変更は反映されません。最初の問題を解決するには、testPoint が必要なインターフェースを正しく実装していることを確認してください。

WPF バインドがオブジェクトのコレクションで機能するには、コレクションの変更を通知できるコレクションを使用する必要があります。testPoints のコレクションが INotifyCollectionChanged インターフェイスを実装していない場合、ライン エンドポイントは元の数のオブジェクトにバインドされます。2 番目の問題を解決するには、ObservableCollection を使用します。

コード ビハインドの代わりに XAML を使用してバインディングをセットアップすることもお勧めします。

于 2012-06-04T07:44:45.887 に答える
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. startpoint / endPoint 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);
    
于 2015-08-19T08:01:23.820 に答える