我试图通过点击按钮来绑定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>
Mainpage.xaml.cs的代码隐藏在这里。我注意到,如果我调用行buildListData();在我设置MyList.DataContext = Listdata之前;然后它工作。否则就像我在这里下面它没有。我必须在按钮单击事件上动态更新列表框然后我通常会调用buildListData();事件处理程序中的方法。这不会在我设置其datacontext后更新 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));
}
}
}
感谢您的时间......
答案 0 :(得分:1)
问题是这个(我想)。您绑定到列表。该列表然后得到更新,但是 - 这是有趣的部分 - 列表不明白添加项目意味着它已更新,因此它在技术上不会触发属性更改事件。当你把它作为一个新的List()
时会发生这种情况所以试试这个 - 首先,转储列表,使用ObservableCollection。等等,我们还没有完成。
现在,为CollectionChanged()事件添加一个处理程序,当你向它添加项目时会触发它。
现在在CollectionChanged事件中,从ListData类中调用FirePropertyChanged(this)。
现在,UI会知道列表已更改,因为项目已添加到其中。