9

私は次のような簡単なコードを書きました

public ObservableCollection<string> Names …
public Window1()
{
    PutInDataIntoNames();
    InitializeComponent();
    this.listBox1.ItemsSource = Names;
}

およびxamlで

<Grid>
    <ListBox Margin="10,11,10,16"
         Name="listBox1"
         Background="Black" 
         Foreground="Orange" 
         />
</Grid>

次に、xamlでItemsSourceプロパティを設定したいと思いました。そのために、私は次のように書きました。

ItemsSource="{Binding Path=Names}"

残念ながら、それは機能しません。その理由と方法を説明していただけますか?

4

3 に答える 3

11

バインディングパスのみを指定すると、バインディングエンジンは現在のパスからナビゲートしようとするDataContextためItemsSource="{Binding Path=Names}"、このようには機能しません。特に、より複雑なことを行う場合は、さまざまな点に注意する必要があります。

DataBindingを初めて使用するすべての人が読むべき最も重要な記事は、MSDNのデータバインディングの概要です。

バインディングに戻るには、XAMLで完全に実行したい場合も同様に実行できます。ウィンドウを直接または相対参照するか、DataContextとして設定することにより、何らかの方法でウィンドウをソースにする必要があります。

1-直接参照:

<Window Name="Window"
        ...>
    <Grid> 
            <ListBox ...
                     ItemsSource="{Binding ElementName=Window, Path=Names}"
                     .../>
    </Grid>
</Window>

2-相対参照

    <Grid> 
            <ListBox ...
                     ItemsSource="{Binding RelativeSource={RelativeSource AncestorType=Window}, Path=Names}"
                     .../>
    </Grid>

3-DataContextの設定

<Window ...
        DataContext="{Binding RelativeSource={RelativeSource Mode=Self}}">
    <Grid> 
            <ListBox ...
                     ItemsSource="{Binding Path=Names}"
                     .../>
    </Grid>
</Window>
于 2011-04-01T18:33:59.107 に答える
5

コードビハインドでこれを行う

public Window1() 
{ 
    PutInDataIntoNames(); 
    InitializeComponent(); 
    DataContext = this;
} 

およびXAMLで

<Grid> 
    <ListBox ItemsSource="{Binding Names}"
         Margin="10,11,10,16" 
         Name="listBox1" 
         Background="Black"  
         Foreground="Orange"   
         /> 
</Grid>

理想的には、MVVMの設計に従って、コードビハインドからデータを分離する必要があります。

于 2010-09-02T07:20:58.307 に答える
5

あなたNamesはフィールドかもしれないようです。パブリックプロパティにのみバインドできます

于 2015-11-18T10:03:22.887 に答える