在我的C#XAML Windows 8.1应用程序中,如何迭代我的ListView?

在我的C#XAML Windows 8.1应用程序中,如何迭代我的ListView?,c#,xaml,listview,data-binding,windows-8.1,C#,Xaml,Listview,Data Binding,Windows 8.1,我对Windows8.1开发、XAML和C#还不熟悉,所以如果这个问题还很初级,请原谅我 我的应用程序中有一个,其中包含一个,如下所示: <ListView ItemsSource="{Binding Mode=TwoWay}" x:Name="ListView_Statistical"> <ListView.ItemTemplate> <DataTemplate> <StackPanel Orientat

我对Windows8.1开发、XAML和C#还不熟悉,所以如果这个问题还很初级,请原谅我

我的应用程序中有一个
,其中包含一个
,如下所示:

<ListView ItemsSource="{Binding Mode=TwoWay}" x:Name="ListView_Statistical">
    <ListView.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <TextBlock Style="{StaticResource SubheaderTextBlockStyle}" Width="100"  Margin="10,20">
                    <Run Text="X/Y " />
                    <!--<Run Text="{Binding Source={StaticResource ThisPage}, Path=i}" />-->
                </TextBlock>
                <TextBox HorizontalAlignment="Left" Text="{Binding xVal}" PlaceholderText="X" InputScope="Number" FontSize="28" Width="100" Margin="0,10,10,10" />
                <TextBox HorizontalAlignment="Left" Text="{Binding yVal}" PlaceholderText="Y" InputScope="Number" FontSize="28" Width="100" Margin="0,10,10,10" />
            </StackPanel>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>
此统计点定义如下:

public ObservableCollection<StatisticalPoint> statisticalPoints
{
    get { return (ObservableCollection<StatisticalPoint>)GetValue(statisticalPointsProperty); }
    set { 
        SetValue(statisticalPointsProperty, value);
        NotifyPropertyChanged("statisticalPoints");
    }
}

// Using a DependencyProperty as the backing store for statisticalPoints.  This enables animation, styling, binding, etc...
public static readonly DependencyProperty statisticalPointsProperty =
    DependencyProperty.Register("statisticalPoints", typeof(ObservableCollection<StatisticalPoint>), typeof(EnterCalc), new PropertyMetadata(0));
公共观测收集统计点
{
get{return(ObservableCollection)GetValue(statisticalPointsProperty);}
集合{
设置值(统计点属性,值);
NotifyPropertyChanged(“统计点数”);
}
}
//使用DependencyProperty作为统计点的后备存储。这将启用动画、样式、绑定等。。。
公共静态只读从属属性StatisticalPoints属性=
DependencyProperty.Register(“statisticalPoints”、typeof(ObservableCollection)、typeof(EnterCalc)、new PropertyMetadata(0));
我不确定是否有必要将此设置为DependencyProperty,或者是否有必要将其设置为遵循INotifyPropertyChanged,但它们似乎并不有害

总之,在我的构造函数中,我向我的统计点添加了一些东西:

this.statisticalPoints = new ObservableCollection<StatisticalPoint>();
this.statisticalPoints.Add(new StatisticalPoint() { xVal = 1.0, yVal = 2.0 });
this.statisticalPoints.Add(new StatisticalPoint() { xVal = 33.0, yVal = 44.0 });
this.statisticalPoints.Add(new StatisticalPoint() { xVal = 555.0, yVal = 666.0 });
this.statisticalPoints.Add(new StatisticalPoint() { xVal = 0.7, yVal = 0.8 });
this.statisticalPoints=新的ObservableCollection();
this.statisticalPoints.Add(新的StatisticalPoint(){xVal=1.0,yVal=2.0});
this.statisticalPoints.Add(新的StatisticalPoint(){xVal=33.0,yVal=44.0});
this.statisticalPoints.Add(新的StatisticalPoint(){xVal=555.0,yVal=666.0});
this.statisticalPoints.Add(新的StatisticalPoint(){xVal=0.7,yVal=0.8});
当我加载页面时,我确实在我的
列表视图中看到了五行,按照我初始化
this.statisticalPoints
中的定义填充

我遇到的问题是:

我在
列表视图的第一个
中更改第一个值,然后点击我的保存按钮。。。但是ListView.Items没有反映我的更改,我也不知道如何查看
本身

我真正想做的是让我的用户可以修改这些统计点,并能够保存它们的更改。要做到这一点,我觉得我需要读取
es中的值,但我不知道如何做到这一点

或者,如果这样做的“正确方法”是在
es中进行更改时保持
this.statisticalPoints
中的数据是最新的,那么我认为
双向
绑定模式可以做到这一点,但是当我在
中进行更改时,
列表视图.Items
此.statisticalPoints
都不会更改

正如您所看到的,我没有在那些
元素中设置事件处理程序,但是我需要它们吗,或者我缺少了一些明显的东西吗

提前谢谢你能给我的任何帮助

要解决最初的问题,请为每个文本框进行绑定
Mode=“TwoWay”
。出于我无法理解的原因,Windows应用商店应用程序中几乎所有应用程序的模式都是默认的
one-way

双向绑定
ItemsSource
几乎没有任何作用,因为UI不会更改集合本身(通过更改,我指的是完全替换)。要迭代您的集合,只需迭代
this.statisticalPoints
,它将拥有当前数据

现在,你还有很多其他的误解,所以试着去理解它们:

  • 您从未显示“保存”按钮,但绑定要么更新源代码,要么不更新。保存按钮通常用于将视图模型中的更改保存到模型中
  • 说到视图模型,您似乎没有视图模型。您不应该直接设置控件的数据上下文,当然也不应该有太多的代码隐藏。为页面创建适当的视图模型对象,并将
    ItemsSource
    绑定到该视图模型的公共属性
  • 除非在代码中替换集合,否则通常不需要对集合进行NotifyPropertyChanged
  • 不过,拥有它不会有什么坏处,除了dependencProperty(DP)的backing属性的setter从未被框架调用,所以将它放在那里很奇怪
  • 你根本不需要DP。DPs的存在使得父控件可以将数据绑定到特殊的用户控件。在您使用用户控件并真正了解DPs的工作原理之前,您不应该使用它们

太棒了,谢谢你的详细回答!我对DependencyProperties(甚至是一个基本的定义)确实有0%的了解,因为文档使用的术语在我能找到的任何地方都没有解释过,也没有包含任何解释事物的示例。你知道哪里有一个“为想了解他们的人一步一步地安排的依赖性财产”类型的来源吗?对此我将深表感激为了减少复杂性和变量,对于这个超级简单的示例,我使用这个页面作为自己的ViewModel。因为我真的不知道什么能起什么作用,所以我想让一切都成为一种依赖性财产,并让一切都遵循INotifyPropertyChanged,这是我试图让[字面上的任何东西]发挥作用的最佳猜测。然后,一旦我有工作要做,我就可以一件一件地整理出需要做的事情。我完全希望这里有一半或更多的东西是不必要的。另外,我只是想澄清一点,我说如果我将绑定模式设置为双向,那么文本框中的更改将立即自动更改绑定StatisticalPoint中的数据,对吗?所以我不需要迭代TextBox UI元素,因为数据已经在我的备份数据结构中了?这将是我的理想选择,因为我似乎不知道如何迭代文本框(我在ListView上看不到允许您在UI中访问其子对象的属性或方法)。哦,还有,我的SaveButton\u Click方法从我正在使用的静态实现中做了大量工作
this.statisticalPoints = new ObservableCollection<StatisticalPoint>();
this.statisticalPoints.Add(new StatisticalPoint() { xVal = 1.0, yVal = 2.0 });
this.statisticalPoints.Add(new StatisticalPoint() { xVal = 33.0, yVal = 44.0 });
this.statisticalPoints.Add(new StatisticalPoint() { xVal = 555.0, yVal = 666.0 });
this.statisticalPoints.Add(new StatisticalPoint() { xVal = 0.7, yVal = 0.8 });