在我的C#XAML Windows 8.1应用程序中,如何迭代我的ListView?
我对Windows8.1开发、XAML和C#还不熟悉,所以如果这个问题还很初级,请原谅我 我的应用程序中有一个在我的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
,其中包含一个
,如下所示:
<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 });