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

In my C# XAML Windows 8.1 app, how can I iterate over my ListView?

我是 Windows 8.1 开发、XAML 和 C# 的新手,所以如果这个问题很初级,请原谅我。

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

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

在代码隐藏中,我像这样设置它的 DataContext:

ListView_Statistical.DataContext = this.statisticalPoints;

this.statisticalPoints 定义如下:

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));

我不确定是否有必要将其设为 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 });

当我加载页面时,我确实在我的 ListView 中看到了五行,按照 this.statisticalPoints.

初始化中的定义填充

我遇到问题的部分是:

我更改了 ListView 中第一个 <TextBox> 中的第一个值,然后点击我的保存按钮...但是 ListView.Items 没有反映我的更改,我不知道如何查看 <TextBox> 本身。

我真正想做的是让我的用户可以修改这一堆统计点并能够保存他们的更改。为此,我觉得我需要读取 <TextBox>es 中的值,但我不知道该怎么做。

或者,如果 'right way' 这样做是为了在 <TextBox> 中进行更改时使 this.statisticalPoints 中的数据保持最新,那么我认为TwoWay 绑定模式可以做到,但是当我在 <TextBox> 中进行更改时,ListView.Itemsthis.statisticalPoints 都没有更改。

没有 在那些 <TextBox> 元素中设置事件处理程序,如您所见,但我需要它们吗,还是我遗漏了一些明显的东西?

在此先感谢您能给我的任何帮助!

要解决您的初始问题,请对每个文本框进行绑定Mode="TwoWay"。由于我无法理解的原因,Windows 商店应用程序中的几乎所有内容都是默认模式 OneWay

使 ItemsSource 绑定两种方式几乎没有任何作用,因为 UI 没有改变集合 本身 (通过改变,我的意思是完全替代)。要遍历您的集合,只需遍历 this.statisticalPoints,它将包含当前数据。

现在,您还有很多其他的误解,所以要尝试 运行 克服它们:

  • 您从未显示过保存按钮,但绑定要么更新您的源,要么不更新。保存按钮通常用于保存从视图模型到模型的更改。
  • 说到视图模型,您似乎没有。您不应该直接设置控件的数据上下文,当然也不应该在代码隐藏中有这么多。为您的页面创建一个合适的视图模型对象,并将 ItemsSource 绑定到该视图模型的 public 属性。
  • 集合上的 NotifyPropertyChanged 通常 是不必要的,除非您在代码中替换集合。
  • 拥有它不会有什么坏处,除了 DependencyProperty (DP) 的支持 属性 的 setter 是 never 调用框架,所以把它放在那里只是 weird
  • 而且你根本不需要摄影指导。 DP 在那里,因此父控件可以将数据绑定到您的特殊用户控件。在您使用用户控件并真正了解 DP 的工作原理之前,您不需要使用它们。