双向绑定根本不更新数据源
本文关键字:更新 数据源 绑定 | 更新日期: 2023-09-27 18:09:58
我正在创建一个windows 8.1手机应用程序,我有来自web服务的数据,这是一个网格的数据源。我遇到的问题是,当我点击其中一个复选框时,它是两个绑定,所以IsChecked属性应该得到更新,但它不是。当我访问数据源时,它在第一次加载网格时给我相同的数据,复选框保持选中状态。下面是xaml代码,下面是加载数据源的代码。我做错了什么?
<ScrollViewer Grid.ColumnSpan="5" Grid.Row="3" Height="330" x:Name="scrollControl">
<ItemsControl Name="lstTop10Picks">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid Margin="6" Name="gridTop11Stocks">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="2*" />
<ColumnDefinition Width="2*" />
<ColumnDefinition Width="2*" />
</Grid.ColumnDefinitions>
<CheckBox Style="{StaticResource CheckStyle}" IsChecked="{Binding IsChecked, Mode=TwoWay}" Grid.Column="0" Grid.Row="3">
<CheckBox.RenderTransform>
<ScaleTransform ScaleX="0.5" ScaleY="0.5" />
</CheckBox.RenderTransform>
</CheckBox>
<TextBlock Style="{StaticResource NumberStyle}" Grid.Column="1" Grid.Row="3" Text="{Binding Id}" />
<TextBlock Style="{StaticResource SummaryStyle}" Grid.Column="2" Grid.Row="3" Text="{Binding Symbol}" HorizontalAlignment="Left" />
<TextBlock Style="{StaticResource SummaryStyle}" Grid.Column="3" Grid.Row="3" Text="{Binding Market}" />
<TextBlock Style="{StaticResource SummaryStyle}" Grid.Column="4" Grid.Row="3" Text="{Binding Return}" />
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
var stocks = doc.Element(ns + "ArrayOfStockRating").Elements(ns + "StockRating")
.Select(n => new
{
Id = count += 1,
Symbol = n.Element(ns + "Symbol").Value,
Market = n.Element(ns + "Market").Value,
Return = n.Element(ns + "ShortRating").Value,
IsChecked = false
})
.ToList();
lstTop10Picks.ItemsSource = stocks;
c#中的匿名类型是不可变的。这意味着它们一旦被创建就不能被更改。为了使双向绑定工作,你需要声明自己的可变类型。
类似:
public class StockViewModel
{
public int Id { get; set; }
public string Symbol { get; set; }
public string Market { get; set; }
public string Rating { get; set; }
public bool IsChecked { get; set; }
}
然后构建您的源集合:
var stocks = doc.Element(ns + "ArrayOfStockRating").Elements(ns + "StockRating")
.Select((n, index) => new StockViewModel
{
Id = index + 1,
Symbol = n.Element(ns + "Symbol").Value,
Market = n.Element(ns + "Market").Value,
Return = n.Element(ns + "ShortRating").Value,
IsChecked = false
}).ToList();
请注意,我删除了LINQ查询中的副作用,因为这只是糟糕的形式。
你必须使用Property来绑定
public string MyProperty { get; set; }
如果你用过
public string MyProperty