我对Windows 10编程中数据绑定的理解是GUI可以反映数据的变化,也可以操纵数据。我错了吗?
我有在App。
中定义的自定义数据列表public static ObservableCollection<Screen> screens;
屏幕的结构就像
public class Screen : INotifyPropertyChanged
{
private string name;
public string Name
{
get { return this.name; }
set
{
if (this.name != value)
{
this.name = value;
this.NotifyPropertyChange("Name")
}
}
}
public bool Enabled { /* same as Name*/ }
public event PropertyChangedEventHandler PropertyChanged;
public void NotifyPropertyChanged(string propName)
{
if (this.PropertyChanged != null)
{
this.PropertyChange(this, new PropertyChangeEventArgs(propName));
}
}
}
在我的一个页面中,让我们说第1页,我在xaml中定义一个列表框
<ListBox Name="screenListBox">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100">
<ColumnDefinition Width="*">
</Grid.ColumnDefinitions>
<CheckBox IsChecked="{Binding Enabled}">
<TextBox Grid.Column="1" Text="{Binding Name}">
<DataTemplate>
<ListBox.ItemTemplate>
</ListBox>
我将列表框绑定到App
中的屏幕列表screenListBox.ItemsSource = App.screens
在page1的构造函数中,我实例化了2个屏幕
App.screens = new ObservableCollection<Screen>() { /*some initial list*/ };
还有另一个页面,比如说第2页,点击按钮从第1页导航到第2页,因为屏幕在App和public static中。所以在第2页我可以访问它们。
this.Frame.Navigate(typeof(Page2), null);
问题是我在第1页上通过GUI进行了一些更改后,它们没有反映回App中的屏幕列表。例如,如果我更改第1页上列表中第一项的名称,然后在页面切换之前设置断点,我可以看到屏幕列表没有更改。我还尝试使用复选框tapped处理程序并手动更新isEnable属性。但我似乎无法在列表中找到复选框的相应索引。
任何帮助将不胜感激!感谢。
编辑:使屏幕继承自INotifyPropertyChanged。
编辑:使用ObservableCollection而不是List
编辑:无法弄清楚其事件处理程序中的抽头复选框的索引
答案 0 :(得分:2)
我认为所有其他人的建议都很有帮助。 @Justin XL已经指出了如何使它反映到后端对象/集合。
制作绑定Twoway。有两种情况:
如果您只想反映对Name和Enabled等属性的更改。只需进行以下更改:
<CheckBox IsChecked="{Binding Enabled, Mode=TwoWay}"/>
<TextBox Grid.Column="1" Text="{Binding Name, Mode=TwoWay}"/>
如果您想反映添加/删除操作等集合,请使用自定义绑定到itemssource属性,如下所示:
Binding sbinding = new Binding();
sbinding.Source = App.screens;
sbinding.Mode = BindingMode.TwoWay;
screenListBox.SetBinding(ItemsControl.ItemsSourceProperty, sbinding);
我已经测试了你的场景,并且效果非常好。