2009-08-16 5 views
1

データバインディングでthe Silverlight documentationを理解できません。私は非常に簡単な例を探します。silverlight基本データバインド

XAMLファイルにUserControlを定義するとします。 UserControlのトップレベルの子は、n列とm行のグリッドです。グリッド内には矩形があります。このように:

<UserControl.... 
    <Grid ...> 
     <Rectangle ...> 

矩形は、グリッド内の特定の(行、列)に表示する必要があります。この行/列の組は、さまざまな進展に従って実行時に変更されます。

私はそれにデータバインディングを使うことができると思います。誰かがこれがデータバインディングの合理的な使用であることを確認できますか?私は結合のために配置するかわからない、

<Rectangle x:Name="rect" 
    Grid.Column = "{Binding ???}" 
    Grid.Row = "{Binding ???}" /> 

しかし:

は、私はこのような何かを行うことができると思います。

何がありますか?そして、私がそこに置いたものをどのように検証するのですか?私は好きな文字列を置くことができ、たとえ独立宣言の全文であっても、それはまったく同じように動作します。今日は何もしません。それは動作しません。例外をスローしません。

私はその文字列が何であるべきかわかりません。私はそこに置いたものをデバッグする方法を知らない。それが正当か妥当かばかげているかどうかを知る方法はないようです。

単純な例がすべてです。私はなぜMSDNのドキュメントがとても鈍いのかわかりません。何かを理解できない唯一の人ですか?like this

依存関係プロパティのターゲット値にバインドできます。データ・バインディングのソース・プロパティー値は、依存関係プロパティーである必要はありません。特定の条件が満たされている場合は、CLRオブジェクトのプロパティになります(データバインディングを参照)。ソースオブジェクトは、名前またはオブジェクトグラフの相対位置によって参照される既存の依存関係オブジェクトでもあります。 Silverlightでは、任意の依存関係プロパティのターゲット値にバインドできます。データ・バインディングのソース・プロパティー値は、依存関係プロパティーである必要はありません。特定の条件が満たされている場合は、CLRオブジェクトのプロパティになります(データバインディングを参照)。ソースオブジェクトは、名前またはオブジェクトグラフの相対位置によって参照される既存の依存関係オブジェクトでもあります。

この種のドキュメントは、私が落ちて泣きたいと思うようにします。誰がそのくそを書く?また、docページには、それらの単語が何を意味するかを示す単一の例は含まれていません。聞いて、英語は私の最初の言語です。そして私は自分自身を.NET開発者だと考えます。しかし、私はその段落の何とか今まで何の意味も作れません。それを書いた人または委員会は、取り戻されて撃たれなければならない。 2倍。

MSDNページの外でも、Silverlightのデータバインディングがどのように機能するかを実際に示す例は見つかりませんでした。 MSDNには、

<Binding ...who cares? ....> 

のような例がありますが、私はそれが何であるか分かりません。それは私のxamlではないし、私はxamlでそれをしたいとは思わない。私が持っているものは、実際のコントロールとその中の四角形です。データバインディングを介して矩形のGrid.ColumnまたはGrid.Rowを指定することはできますか?

今、私は、矩形は、UserControlの子であるグリッド内に存在すると言った。

<UserControl.... 
    <Grid ...> 
     <Rectangle ...> 

私はコードビハインドファイルユーザーコントロールのための取得、それは次のようになります。

public partial class MyThing : UserControl 
{ 
    .... 
} 

私は(ユーザーコントロール内)グリッド内の矩形のTE位置をバインドしたい場合はどう経由UserControlのintプロパティ。それをしてもいいですか? Grid.RowPropertyとGrid.ColumnPropertyをの何かにバインドできますか?? XとYが次のような場合:

これを矩形のgrid.rowとgrid.columnにバインドできますか?どうやって?

誰かが明確な例を挙げてください。

答えて

4

FrameworkElementは、DataContext(nullでない場合)が任意のデータクラスのインスタンスです。あなたはそれのプロパティにバインドしていますDataContext

<Rectangle Width="{Binding MyRectWidth}" x:Name="_myRect" /> 

分離コード:

public class Foo 
{ 
    public double MyRectWidth { get; set; } 
} 

Foo foo = new Foo(); 
foo.MyRectWidth = 100; 
_myRect.DataContext = foo; 

表記{Binding MyRectWidth}{Binding Path=MyRectWidth}の省略形です。

IValueConverterを実装するオブジェクトのインスタンスなど、バインディングに他のパラメータを指定して、送信元と送信先の値を変換することができます。

Binding b = new Binding(); 
b.Path = "MyRectWidth"; 
_myRect.SetBinding(Rectangle.WidthProperty, b); 

A FrameworkElementDataContextは、ほとんどの場合、その親から継承されます。

XAML構文のプログラムのバージョンはBindingオブジェクトです。より複雑なオブジェクトの編集がどのようにして非常に簡単になるかを見ることができます。

<UserControl x:Class="PersonEditControl"> 
    <StackPanel> 
     <TextBox Text="{Binding Name, Mode=TwoWay}" /> 
     <TextBox Text="{Binding Address, Mode=TwoWay}" /> 
     <TextBox Text="{Binding Phone, Mode=TwoWay}" /> 
    </StackPanel> 
</UserControl> 

(あなたは私がバインド上の他のプロパティを設定しました。この場合に気づくでしょう:。Mode=TwoWayをこれはバックのDataContextに制御の変更を伝播するために必要です。)

public class Person 
{ 
    public string Name { get; set; } 
    public string Address { get; set; } 
    public string Phone { get; set; } 
} 

public partial class PersonEditControl 
{ 
    void SetPerson(Person p) 
    { 
     // child controls inherit this DataContext, if they are 
     // not explicitly given another: 
     DataContext = p; 
    } 
} 

でコントロール階層内の任意のポイントで、新しいDataContextを指定することができ、そのポイントからその子に継承されます。

Silverlight 3では、新しいバインディングマークアップの拡張子ElementNameが導入されています。これにより、別のXAML要素をバインディングソースとして指定できます。私はUserControl(例えば_myControlと言う)に名前をつけて遊んだのですが、子コントロールのプロパティで{Binding Path=PropertyName, ElementName=_myControl}を指定しても動作しませんでした。

私はそれに多くの時間を費やしていないと私は何かを逃した可能性があります。最低でも、手動でこの関係を指定することができます。

public partial class MyThing : UserControl 
{ 
    public int X { get; set; } 
    public int Y { get; set; } 

    public MyThing() 
    { 
     InitializeComponent(); // important to call this first: loads the XAML 

     _myRect.DataContext = this; 
    } 
} 

このパズルのもう一つの重要な部分は、インタフェースINotifyPropertyChangedです。DataContextがこのインターフェイスを実装していて、プロパティが変更されたときにPropertyChangedイベントが発生すると、それらのプロパティへのバインディングが変更を受け取りコントロールに伝播します。

+0

非常に興味深いです。あなたは元に戻ってその事例を自分の状況に合わせることができますか?問題のRectangleのルート親であるUserControl上に存在するプロパティにバインドできますか? ?XAMLで矩形のデータコンテキストを指定するにはどうすればよいですか? XAMLで、RectangleのdatacontextがUserControlであることを指定できますか?それとも暗黙に理解されていますか? – Cheeso

+0

あなたの状況に関する情報を追加しました。 –

+0

あなたの努力に感謝します。あなたは明らかにこの答えをまとめるのに時間をとることになります。そして、INotifyPropertyChangedはどのようにフィットしますか? UserControl内の子コントロールのプロパティをUserControlクラスのC#プロパティにバインドする場合は、DataContext = thisをUserControlに設定する必要があります。 – Cheeso

関連する問題