0

私はまだ非常に新しく、最初の本格的なデータバインディングを試しています。私はそれがどのように機能するかについてたくさん読みましたが、この具体的な例に苦労しています。私はこれで見つけたすべてのリンクを読み込もうとしましたが、ほとんどの情報源は重要な場所で少し不正確になる傾向があります。だからここに行きます:

-私のアプリケーションは、タイプ「リスト」の変数「PlayerList」を動的に生成します。ここで、「Player」は複雑なオブジェクトです。

-これをBindingを介してリストボックスに表示したい。明らかに、Playerは複雑なオブジェクトなので、そのためのDataTemplateを作成したいと思います。したがって、「Window1.xaml」には次のようなものがあります。

<ListBox 
    Name="ListBox_Players" 
    ItemsSource="{Binding Source={StaticResource PlayerListResource}}"
    ItemTemplate="{StaticResource PlayerTemplate}">
</ListBox>  

'App.xaml'には次のようなものがあります。

<DataTemplate x:Key="PlayerTemplate">  <!-- DataType="{x:Type Player}" --> 
    <StackPanel Orientation="Horizontal">
      <TextBlock Text="{Binding Path=name}"/>
      <TextBlock Text=", "/>
      <TextBlock Text="{Binding Path=nrOfTabls}"/>
    </StackPanel>
</DataTemplate>

もちろん、このテンプレートは後でより冗長になります。上記のように、PlayerList変数のリソースを作成しようとしましたが、まだ管理していません。つまり、smthnです。このような

<src: XXX x:Key="PlayerListResource"/>

XXXの場合、私が理解しているように、Resource変数のクラスを入力する必要があります。私は試した

List<Player>, List<src:Player>

など、しかしobv。XAMLで「<、>」文字に問題があります。

また、別の問題があります。リソースを宣言するのではなく、直接バインドして(つまり、C#で「ListBox_Players.ItemsSource = PlayerList;」と記述して)、「ItemTemplate」宣言を削除し、PlayerクラスのToString()メソッドを上書きして出力します。バインディングが機能することを確認できたプレーヤーの名前(つまり、リストボックスにプレーヤー名のリストが表示されます)。しかし、テンプレートを再度挿入すると、「」、「テンプレートが機能しません」のみが表示されます。

4

1 に答える 1

1

他に何も含まれていないコンマだけを取得しているという事実は、メンバーの名前が(ある時点でこの問題が発生しました)Playerの名前と一致しないか、関連するメンバーにアクセスできないことを示しています。Path=DataTemplatePlayer

これまでに示したコードをテストしたところ、正常に機能しているように見えました。私が行った唯一の変更は、この行を変更することでした。

ItemsSource="{Binding Source={StaticResource PlayerListResource}}"

この行に:

ItemsSource = "{Binding}"

これは、実行時にItemsSourceを取得することをプログラムに通知します。

Playerのクラスは:

class Player {
    public string name { get; set; }
    public int nrOfTabls { get; set; }
}

そして私MainWindow.xaml.csは:

public partial class MainWindow : Window {
    private ObservableCollection<Player> players_;

    public MainWindow() {
        InitializeComponent();

        players_ =new ObservableCollection<Player> () {
            new Player() {
                name = "Alex",
                nrOfTabls = 1,
            },
            new Player() {
                name = "Brett",
                nrOfTabls = 2,
            },
            new Player() {
                name="Cindy",
                nrOfTabls = 231,
            }
        };

        ListBox_Players.ItemsSource = players_;
    }
}
于 2012-07-30T14:22:11.347 に答える