Список Silverlight не является обязательным - PullRequest
1 голос
/ 17 декабря 2010

Я пытаюсь привязать список Silverlight через код, который указывается при нажатии кнопки.

Вот код XAML

           <ListBox  x:Name="MyList" DataContext="Listdata" ItemsSource="{Binding Mode=TwoWay, Path=Listdata}">

            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{Binding Name,Mode=TwoWay}" Margin="5" Foreground="Red"></TextBlock>
                        <TextBlock Text="{Binding Age,Mode=TwoWay}" Margin="5"></TextBlock>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

Codehind для Mainpage.xaml.cs здесь.Я заметил, что если я вызываю строку buildListData ();перед тем, как установить MyList.DataContext = Listdata;тогда это работает.В противном случае, как у меня здесь ниже, это не так.Предположим, мне нужно динамически обновлять Listbox при событии нажатия кнопки, после чего я обычно вызываю buildListData ();метод в его обработчике событий.Это также не будет работать, так как я обновляю значение свойства Listdata после установки его текстового контекста.Любая помощь?

    public partial class MainPage : UserControl, INotifyPropertyChanged
{
        private List<ListData> _listData;
        public List<ListData> Listdata
        {
            get {return _listData ;}
        set { _listData = value; FirePropertyChanged("Listdata"); }
        }



        public event PropertyChangedEventHandler PropertyChanged;

        protected void FirePropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }




    public MainPage()
    {       
        // Required to initialize variables
            InitializeComponent();

            MyList.DataContext = Listdata;
            MyList.ItemsSource = Listdata;
            buildListData();
            FirePropertyChanged("Listdata");
    }



        private void buildListData ()
        {
            Listdata = new List<ListData>();

            Listdata.Add(new ListData(){Name="Person 1", Age=30});
            Listdata.Add(new ListData() { Name = "Person 2", Age = 31 });
            Listdata.Add(new ListData() { Name = "Person 3", Age = 32 });
            Listdata.Add(new ListData() { Name = "Person 4", Age = 33 });
            Listdata.Add(new ListData() { Name = "Person 5", Age = 34 });

        }
}

Вот класс ListData

 public class ListData : ViewModelBase
{
    private string _name;
    private int _age;


    public string Name
    {
        get { return _name; }
        set { _name = value; FirePropertyChanged("Name"); }
    }

    public int Age
    {
        get { return _age; }
        set { _age = value; FirePropertyChanged("Age"); }
    } 

}

Класс ViewMOdelBase здесь

    public class ViewModelBase : INotifyPropertyChanged
{



    public event PropertyChangedEventHandler PropertyChanged;

    protected void FirePropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }



}

Спасибо за ваше время ...

1 Ответ

1 голос
/ 17 декабря 2010

Проблема в этом (я думаю). Вы привязываетесь к списку. Затем список обновляется, НО - вот забавная часть - список не понимает, что добавление элементов в него означает, что он был обновлен, поэтому он не запускает событие изменения свойства. Это происходит, когда вы делаете новый список ()

Так что попробуйте это - сначала сбросьте список, используйте ObservableCollection. Подожди, мы еще не закончили.

Теперь добавьте обработчик для события CollectionChanged (), который будет срабатывать при добавлении к нему элементов.

Теперь в событии CollectionChanged вызовите FirePropertyChanged (this) из класса ListData.

Теперь пользовательский интерфейс будет знать, что список изменился, поскольку в него были добавлены элементы.

...