0

現在、listBoxにデータを追加しようとしています。私のXAMLを見ると、これは私が作成したリストボックスです。

<ListBox 
            Height="517" 
            HorizontalAlignment="Left" 
            Margin="12,84,0,0" 
            Name="searchList" 
            VerticalAlignment="Top" 
            Width="438" 
            SelectionChanged="SearchList_SelectedEvent">

            <!-- What each listbox item will look like -->
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel>
                        <TextBlock Text="{Binding firstName}" FontSize="28" />
                        <TextBlock Text="{Binding lastName}" FontSize="28" />
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>

</ListBox>

そして、listBoxを含む画面に関連付けられている私の.cssクラスでは:

public Search()
    {
        InitializeComponent();

        //The variables that I want to render in the list         
        string firstName = "John";
        string lastName = "Smith";
    }  

だから私の質問は、データバインディングはどのように正確に機能するのかということです。XAMLで変数をバインドしようとしましたが、それが機能するかどうか、または正しく実行しているかどうかはわかりません。

手始めに、XAMLはこれらの変数を見つける場所をどのように知っていますか?

4

3 に答える 3

2

Tomas Jansson が別の回答で提案したこのチュートリアルを実行することをお勧めします。あなたのコードのそれとは別に、

最初に、ListBox にバインド可能なデータを含む List または ObservableCollection を作成する必要があります。

List myList = new List()
          {new Name() { firstName = "sdfjsdk", lastName= "sdfsfsjdf"},
           new Name() { firstName = "bthbbh", lastName= "ereyyyu"},
           new Name() { firstName = "svbfbb", lastName= "sdfertbn"} };

名前は

class Name()
{
    string firstName;
    string lastName;
}

コードビハインドでは、

myList.ItemsSource = myList; //this lets the XAML from where to fetch the data to bind
于 2012-07-09T10:25:46.383 に答える
1

現在のコードは機能しないことに注意してください。

各コントロールは、論理ツリーと呼ばれるものに存在します。論理ツリーは、この例では ListBox がルートであり、その中のコントロールが子であるコントロールの階層のようなツリーです。

例えば

RootControl
|
|---| ChildOfRootControl
    |
    |----| ChildOfChildOfRootControl
    |    |
    |    | AnotherChildOfChildOfRootControl
    |
    | AnotherChildOfRootControl

各コントロールには DataContext プロパティがあります。このプロパティは、ツリーをルートからすべての子に自動的に伝達されます (たとえば、任意のコントロールに DataContext を設定すると、コントロールのすべての子にこの DataContext が表示されます。ただし、派生するものは例外です)。ItemsControl子は通常、バインドされたプロパティの DataContext を持っていますItemsSource)。この DataContext は、ツリーを下って子コントロールにのみ移動します。新しい値を子コントロールの DataContext に配置すると、親の DataContext がオーバーライドされます。

DataContext は、コントロールがバインドされる既定のオブジェクトです。つまり、バインディングで追加のパラメーターを指定しない場合、DataContext がターゲット オブジェクトになります。

Text="{Binding FirstName}"

上記のバインディングは、DataContext を調べます。他の何かにバインドするには、バインディングなどで Source または ElementName を指定する必要があります

DataContext に加えて、ほとんどのリストのようなコントロールが継承する ItemsControl と呼ばれる基本コントロールがあります。

ItemsControl は、コントロールに表示される項目のリストを指定する ItemsSource というプロパティを公開します。これは、DataContext と ItemsSource の両方を同時に持つことができるという点で、DataContext とは少し異なります。

さらに、ItemsControl 内の子項目 (各リストボックス項目など) は親コントロールから DataContext を継承せず、代わりに DataContext が個別にバインドされている項目を指します。

例 - 'MyObject' の DataContext をルート コントロール (グリッド) に割り当て、'MyListOfObjects' を ListBox に割り当てたとします。

Grid (DataContext = MyObject)
|
|---| ListBox (DataContext = MyObject) (ItemsSource = MyListOfObjects)
    |
    |----| ListBoxItem (DataContext = MyListOfObjects[0])
    |    |
    |    | ListBoxItem (DataContext = MyListOfObjects[1])
    |    |
    |    | ListBoxItem (DataContext = MyListOfObjects[2])
    |    |
    |    | ListBoxItem (DataContext = MyListOfObjects[3])
    |
    | TextBox (DataContext = MyObject)

あなたの場合、ListBox.ItemsSource プロパティは NULL になるため、バインディング パスは機能しません。このコードを実行すると、バインディングが存在しないプロパティに評価されるため、出力ウィンドウにバインディング式のエラーが表示される可能性が高くなります (実際、この場合、ItemsSource から作成された項目がないため、表示されません)。

通常、オブジェクト (ビジネス オブジェクトなど) にバインドするか、ページ上の他のコントロールにバインドします。

したがって、あなたの場合、おそらく FirstName および LastName プロパティを格納するオブジェクトを作成する必要があります。また、ListBox を使用しているため、これらの項目のコレクションをバインドする必要があるようです。したがって、理想的には、何らかの変更通知メカニズムを実装するコレクションが必要です。これにより、リストが変更されたときに UI が確実に更新されます。

ObservableCollection はこれを実装しているため、ObservableCollection を作成して ListBox の ItemsSource に割り当てると機能します。

また、ObservableCollection の変更通知はリスト レベルでのみ発生し (リストが変更された場合、たとえばアイテムが追加された場合)、オブジェクト レベルでは発生しないことにも注意してください。リストに含まれるオブジェクトの変更も UI に反映させたい場合は、これらのオブジェクトに変更通知を実装する必要があります。これは、INotifyPropertyChanged インターフェイスを実装することによって行われます。

最後に、バインディングを編集できるようにする場合は、バインディングでこれを指定してください。Silverlight はデフォルトで、すべてのバインディングが読み取り専用であると想定します。Windows Phone 7 が何をするのかはわかりませんが、バインディングでModeを指定する必要があるかもしれません

例えば

Text="{Binding SomeText, Mode=TwoWay}"
于 2012-07-09T10:52:48.967 に答える
0

検索してみましたか?これはうまくいけば、データバインディングがどのように機能するかの多くを説明しています: http://jesseliberty.com/2010/11/10/windows-phone-from-scratch-6-data-binding-really/

于 2012-07-09T10:17:10.810 に答える