Я пытаюсь привязать список 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));
}
}
}
Спасибо за ваше время ...