添加和更新数据绑定列表框C#windows phone

时间:2012-02-17 21:42:08

标签: list windows-phone-7 data-binding listbox

我希望这个问题不要愚蠢,我试图寻找5小时的解决方案,并且大多数在这个网站上找到了有用的东西,但我无法解决我的问题。

我的物品类只有这个属性:

public string ItemName { get; set; }

一个持有物品的类:

public class ShoppingListItems
{
    public static List<Item> ItemCollection { get; set; }

    public ShoppingListItems()
    {
        ItemCollection = new List<Item>();
        AddAnItem("test");
    }

    public static void AddAnItem(string name)
    {
        ItemCollection.Add(new Item()
        {
            ItemName = name
        });
    }
}

在我的XAML文件中,绑定相关代码是:

    xmlns:application="clr-namespace:ShoppingListTest"

    <Grid.Resources>
        <application:ShoppingListItems x:Key="ShoppingListItems" />
    </Grid.Resources>
    <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0" DataContext="{StaticResource ShoppingListItems}">
        <ListBox x:Name="listBox1"  Height="Auto" ItemsSource="{Binding ItemCollection, Mode=TwoWay}">

                        <TextBlock x:Name="textBlock1" Text="{Binding ItemName}" FontSize="50"  />

然后在我的MainPage.xaml.cs中,在KeyDown的方法中我有:

ShoppingListItems.AddAnItem(textBox1.Text);

列表工作得很好,并在listBox中显示“test”,但添加到列表不起作用,我试图查看一些NotifyPropertyChanged的东西,没有任何运气。

有关更新listBox需要做什么的任何想法?如果有人有一些技巧可以使这项工作,我会很高兴!

3 个答案:

答案 0 :(得分:2)

首先我建议不要使用静态成员,它似乎在没有使用的情况下效果更好。

ShoppingListItems的微小更改:

public class ShoppingListItems
{
    public ObservableCollection<Item> ItemCollection { get; set; }

    public ShoppingListItems()
    {
        ItemCollection = new ObservableCollection<Item>();
        AddAnItem("test");
        AddAnItem("test2");
        AddAnItem("test3");
    }

    public void AddAnItem(string name)
    {
        ItemCollection.Add(new Item()
        {
            ItemName = name
        });
    }
}

事物是非静态的,List&lt;&gt;是ObservableCollection&lt;&gt;代替。

在xaml中:

<Grid>
    <Grid.Resources>
        <DataTemplate x:Key="itemLayout" DataType="{x:Type local:Item}">
            <TextBlock Text="{Binding ItemName}" FontSize="50" />
        </DataTemplate>
    </Grid.Resources>

    <ListBox x:Name="itemsListBox" Margin="2" ItemsSource="{Binding}" 
             ItemTemplate="{DynamicResource itemLayout}" 
             IsSynchronizedWithCurrentItem="True">
    </ListBox>
</Grid>

在代码隐藏(与xaml文件对应的.cs文件)中:

    private ShoppingListItems _shoppingList;

    public MainWindow()
    {
        InitializeComponent();

        _shoppingList = new ShoppingListItems();
        itemsListBox.DataContext = _shoppingList.ItemCollection;
    }

编辑:

我所做的是将数据模板放在网格资源中,同时将数据模板作为列表框资源的一部分。据我所知,唯一真正的区别是,如果模板是网格资源的一部分,它可以在多个地方使用。假设您想要两个购物清单,可能是一个用于您需要的东西,另一个用于您已购买的东西,并且您希望它们以相同的方式格式化,最好将模板放在网格中,以便两个列表都可以引用它。由于你只有一个列表,这可能无关紧要,无论哪种方式都没关系。

至于Singleton模式,请参阅: Singleton on Wikipedia

最简单的方法是让您的ShoppingListItem看起来像这样:

public class ShoppingListItems
{
    private static ShoppingListItems _instance = new ShoppingListItems();
    public ObservableCollection<Item> ItemCollection { get; private set; }

    public static ShoppingListItems Instance { get { return _instance; } }

    private ShoppingListItems()
    {
        ItemCollection = new ObservableCollection<Item>();
        AddAnItem("test");
        AddAnItem("test2");
        AddAnItem("test3");
    }

    public void AddAnItem(string name)
    {
        ItemCollection.Add(new Item()
        {
            ItemName = name
        });
    }
}

答案 1 :(得分:1)

您是否尝试将ItemCollection更改为ObservableCollection而不是List?

答案 2 :(得分:0)

非常感谢Zik,您的代码更改工作正常。在我的XAML代码中,我只改为ItemSource =“{Binding}”。

我真的不明白你最后的评论。需要做一些谷歌搜索试图理解,我做的对我来说几乎是新的:)

项目列表的我的XAML代码现在是这样的:

        <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0" DataContext="{StaticResource ShoppingListItems}">
        <ListBox x:Name="listBox1"  Height="Auto" ItemsSource="{Binding}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Grid Margin="5" >
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="Auto" />
                            <ColumnDefinition Width="*" />
                        </Grid.ColumnDefinitions>
                        <TextBlock x:Name="textBlock1" Text="{Binding ItemName}" FontSize="50"  />
                    </Grid>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </Grid>

在主网格上我有这个:

        <Grid.Resources>
        <application:ShoppingListItems x:Key="ShoppingListItems" />
    </Grid.Resources>

这似乎很有效。但如果它更好,我应该改变什么来添加你的代码,如:

<DataTemplate x:Key="itemLayout" DataType="{x:Type local:Item}">

ItemTemplate="{DynamicResource itemLayout}" 
IsSynchronizedWithCurrentItem="True"