3

「Hello World」タイプのアプリケーションがあります。
listbox.ItemsSource = Players. Players は、INotifyPropertyChanged を実装する Player の ObservableCollection です。

Players コンストラクターにアイテムを追加すると、アイテムが正常に表示されます。既存のアイテムを更新すると、変更が反映されます。しかし、ObserveableCollection のアイテムを追加または削除すると、リストボックスに追加/削除されたアイテムが反映されません。

メインページの xaml:

    <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
        <ListBox Name="lstPlayers" ItemsSource="{Binding}" Margin="12,66,13,24" Grid.Row="1">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <!--<StackPanel Background="#FFD1D1D1">-->
                    <Grid Margin="0,0,0,0" Grid.RowSpan="2">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="60"/>
                            <ColumnDefinition Width="*"/>
                        </Grid.ColumnDefinitions>
                        <TextBlock Grid.Column="0" Text="{Binding Number}" FontSize="48"  />
                        <TextBlock Grid.Column="1" Text="{Binding Name}" FontSize="48" />
                    </Grid>
                    <!--</StackPanel>-->
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
        <Button Content="Button" Height="95" HorizontalAlignment="Left" Margin="183,350,0,0" Name="button1" VerticalAlignment="Top" Width="260" Click="button1_Click" />
        <Button Content="Button" Height="72" HorizontalAlignment="Left" Margin="198,472,0,0" Name="button3" VerticalAlignment="Top" Width="232" Click="button3_Click" />
    </Grid>

リストボックスはコード ビハインドにバインドされています。

  lstPlayers.ItemsSource = plys;

プレイヤークラス:

using System.ComponentModel;
namespace DatabindList
{
public class TcrPlayer : INotifyPropertyChanged
{


    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    private string _name;
    public string Name
    {
        get { return _name; }
        set
        {

            if (_name != value)
                _name = value;

            NotifyPropertyChanged("Name");

        }
    }
   }
}

選手クラス:

using System.Collections.Generic;
using System.Collections.ObjectModel;

namespace DatabindList
{

public class TcrPlayers : List<TcrPlayer> 
{
    public ObservableCollection<TcrPlayers> Items { get; private set; }



    public TcrPlayers()
    {
        //these are displayed
        Add(new TcrPlayer { Name = "Christine"});
        Add(new TcrPlayer { Name = "Janet"});
        Add(new TcrPlayer { Name = "Ian"});
    }


    public void AddPlayer()
    {
        //THIS HAS NO EFFECT ON THE LISTBOX
        Add(new TcrPlayer { Name = "Newbie", Number = "99" });

    }


   }
}

MainPage のコード ビハインドを使用して、リスト内の既存の項目を更新できます。

            var itm = lstPlayers.SelectedItem as TcrPlayer;
            itm.Name = "Fred";

しかし、Players コレクション内のアイテム数に加えられた変更を反映することはできません。

4

2 に答える 2

4

TcrPlayersそれ自体から派生しList<TcrPlayer>、それ自体にアイテムを追加します。ただし、ObservableCollection<TcrPlayer>プロパティはそのリストにまったく接続されていません。plysそれが aであると仮定すると、 aTcrPlayersにまったくバインドしていませんObservableCollection-あなたは non-observable にバインドしていますList

ObservableCollection<TcrPlayer>未使用のプロパティの代わりに継承しList<TcrPlayer>て削除すると、希望する場所に近づく可能性があります。

余談ですが、新しい機能を追加しない限り、コレクション クラスからの継承は一般にあまり有用とは見なされないため、このパターンが頻繁に使用されることはありません。通常、親のビューモデルのプロパティを持っていてObservableCollection<TcrPlayer>、リストボックスをそれにバインドItemsSourceします。

そういえば、 XAMLで現在の とコードビハインドItemsSourceで 2 回も設定しています。{Binding}DataContext

于 2013-08-14T12:31:21.920 に答える
2

あなたはあなたのObservableCollection. 代わりに、TcrPlayersクラスはリスト自体です (から派生しますList<T>)。

プロパティから派生しObservableCollectionて削除するか、の代わりに使用します。ItemsItems.Add(..)Add()

例えば

public class TcrPlayers : ObservableCollection<TcrPlayer> 
{
..

また

public class TcrPlayers
{
    public ObservableCollection<TcrPlayers> Items { get; private set; }

    public TcrPlayers()
    {
        //these are displayed
        Items.Add(new TcrPlayer { Name = "Christine"});
        Items.Add(new TcrPlayer { Name = "Janet"});
        Items.Add(new TcrPlayer { Name = "Ian"});
    }
于 2013-08-14T12:30:43.427 に答える