【问题标题】:In my C# XAML Windows 8.1 app, how can I iterate over my ListView?在我的 C# XAML Windows 8.1 应用程序中,如何迭代我的 ListView?
【发布时间】:2015-04-15 00:36:29
【问题描述】:

我是 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 中更改第一个&lt;TextBox&gt; 中的第一个值,然后点击我的保存按钮...但是 ListView.Items 没有反映我的更改,我无法弄清楚如何查看在&lt;TextBox&gt; 本身。

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

或者,如果这样做的“正确方法”是在&lt;TextBox&gt;es 中进行更改时保持this.statisticalPoints 中的数据是最新的,那么我认为TwoWay 绑定模式会这样做,但是当我在 &lt;TextBox&gt; 中进行更改时,ListView.Itemsthis.statisticalPoints 都不会更改。

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

提前感谢您能给我的任何帮助!

【问题讨论】:

    标签: c# xaml listview data-binding windows-8.1


    【解决方案1】:

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

    以两种方式进行ItemsSource 绑定几乎没有任何作用,因为UI 不会更改集合本身(通过更改,我的意思是完全替换)。要遍历您的集合,只需遍历 this.statisticalPoints 即可获得当前数据。

    现在,你有很多其他的误解,所以试着把它们弄清楚:

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

    【讨论】:

    • 太棒了,感谢您的详细回答!我对 DependencyProperties(甚至是基本定义)的理解确实只有 0%,因为文档使用的术语在我能找到的任何地方都没有解释过,并且不包含任何说明问题的示例。知道在哪里有一个“为想要了解它们的人逐步布置的 DependencyProperties”类型的来源吗?我将对此深表感谢。 =)
    • 为了减少复杂性和变量,我将此页面用作这个超级简单示例的自己的 ViewModel。因为我真的不知道什么是做什么的,所以将所有内容都设为 DependencyProperty 并让所有内容都遵循 INotifyPropertyChanged 是我试图让 [字面上任何东西] 工作的最佳猜测。然后,一旦我得到了一些工作,我就可以一个一个地削减这些部分,以确定什么是必要的。我完全希望这里有一半或更多的东西是不必要的。
    • 另外,为了澄清一点,我是否正确地说,如果我使用双向绑定模式,那么 TextBoxes 中的更改将立即自动更改绑定的 StatisticalPoint 中的数据?所以我不需要遍历 TextBox UI 元素,因为数据已经在我的支持数据结构中了?那将是我的理想,因为我似乎无法弄清楚如何迭代 TextBoxes(我在 ListView 上没有看到任何属性或方法可以让您在 UI 中访问其子项)。
    • 哦,另外,我的 SaveButton_Click 方法从我正在远离的静态实现中做了很多事情(网格中的 5 行,每行有两个文本框,一个用于 X,一个用于 Y ),获取 TextBoxes 中的值并将它们序列化为 JSON 并将它们保存到文本文件中。所以我故意把那部分遗漏了,因为它离它需要的地方并不近。事实上,我需要知道如何使用 ListView 实现从 UI 中取回数据的原因是,我 可以 换掉 SaveButton_Click 实现。这有意义吗?
    • @KyleHumfeld 就可理解性而言不确定,但他们的 WPF 页面很好:msdn.microsoft.com/en-us/library/ms752914%28v=vs.110%29.aspx(请注意,DP 在 WinRT 和 WPF 中的工作方式相同)。拥有一个单独的视图模型,除了更好的设计之外,还会让你很快意识到 DP 是不对的,因为你必须让你的 VM 成为DependencyObject。上课没那么难,做对了就值得!
    猜你喜欢
    • 2015-06-19
    • 2015-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多