C# 使用数据绑定从UI更改数据

C# 使用数据绑定从UI更改数据,c#,windows,uwp,C#,Windows,Uwp,我对Windows10编程中数据绑定的理解是,GUI可以反映数据的变化,也可以操作数据。我错了吗 我在应用程序中定义了自定义数据列表 public static ObservableCollection<Screen> screens; 在我的一个页面中,比如说第1页,我用xaml定义了一个列表框 <ListBox Name="screenListBox"> <ListBox.ItemTemplate> <DataTemplat

我对Windows10编程中数据绑定的理解是,GUI可以反映数据的变化,也可以操作数据。我错了吗

我在应用程序中定义了自定义数据列表

public static ObservableCollection<Screen> screens;
在我的一个页面中,比如说第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>
在page1的构造函数中,我实例化了2个屏幕

App.screens = new ObservableCollection<Screen>() { /*some initial list*/ };
问题是在我通过GUI在第1页上做了一些更改后,它们并没有反映回应用程序中的屏幕列表。例如,如果我在第1页更改列表中第一项的名称,然后在切换页面之前设置断点,我可以看到屏幕列表没有更改。我还尝试使用复选框处理程序并手动更新isEnable属性。但是我似乎在列表中找不到复选框对应的索引

任何帮助都将不胜感激!谢谢

编辑:将从INotifyPropertyChanged继承的屏幕设置为已更改

编辑:使用ObservableCollection而不是List


Edit:无法在事件处理程序中找出已点击复选框的索引

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

把装订成两个方向。有两种情况:

  • 如果只想反映对属性(如名称和已启用)的更改。只需做以下更改:

    <CheckBox IsChecked="{Binding Enabled, Mode=TwoWay}"/>
    <TextBox Grid.Column="1" Text="{Binding Name, Mode=TwoWay}"/>
    

  • 我已经测试了您的场景,效果非常好。

    您的Screen类需要实现INotifyPropertyChanged。感谢您的回复。我为screen类实现了INotifyPropertyChanged,结果仍然相同。Bind not Bond我得到的英语可能是第二种语言尝试不使screens保持静态并将其传递给计算机。此外,您启用的绑定应该是双向的。我不敢相信这个问题花了我3天的时间才解决,而且解决方法非常简单。谢谢你@Alan Yao。谢谢你的提及。:)
    App.screens = new ObservableCollection<Screen>() { /*some initial list*/ };
    
    this.Frame.Navigate(typeof(Page2), null); 
    
    <CheckBox IsChecked="{Binding Enabled, Mode=TwoWay}"/>
    <TextBox Grid.Column="1" Text="{Binding Name, Mode=TwoWay}"/>
    
    Binding sbinding = new Binding();
    sbinding.Source = App.screens;
    sbinding.Mode = BindingMode.TwoWay;
    screenListBox.SetBinding(ItemsControl.ItemsSourceProperty, sbinding);