双向绑定根本不更新数据源

时间:2014-06-24 08:14:10

标签: c# windows-phone

我正在创建一个Windows 8.1手机应用程序,我有一个来自webservice的数据,这是网格的数据源。我遇到的问题是,当我点击其中一个复选框时,它是一个两个绑定,因此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;

2 个答案:

答案 0 :(得分:1)

您必须使用Property进行绑定,例如

 public string MyProperty { get; set; }

如果你已经使用过

 public string MyProperty

然后它将无法工作。

答案 1 :(得分:1)

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查询中的副作用,因为这只是一种不好的形式。