使用数据绑定来更改UI中的数据

时间:2015-10-02 23:29:09

标签: c# windows uwp

我对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

编辑:无法弄清楚其事件处理程序中的抽头复选框的索引

1 个答案:

答案 0 :(得分:2)

我认为所有其他人的建议都很有帮助。 @Justin XL已经指出了如何使它反映到后端对象/集合。

制作绑定Twoway。有两种情况:

  1. 如果您只想反映对Name和Enabled等属性的更改。只需进行以下更改:

    <CheckBox IsChecked="{Binding Enabled, Mode=TwoWay}"/>
    <TextBox Grid.Column="1" Text="{Binding Name, Mode=TwoWay}"/>
    
  2. 如果您想反映添加/删除操作等集合,请使用自定义绑定到itemssource属性,如下所示:

    Binding sbinding = new Binding();
    sbinding.Source = App.screens;
    sbinding.Mode = BindingMode.TwoWay;
    screenListBox.SetBinding(ItemsControl.ItemsSourceProperty, sbinding);
    
  3. 我已经测试了你的场景,并且效果非常好。