Добавление и обновление связанного списка данных C # Windows Phone - PullRequest
1 голос
/ 18 февраля 2012

Я надеюсь, что этот вопрос не тупой, я пытался найти решение в течение 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);

Список отлично работает и показывает «test» в listBox, но добавление в список делаетне работает, я пытался взглянуть на некоторые вещи NotifyPropertyChanged, без какой-либо удачи.

Есть идеи, что мне нужно сделать, чтобы обновить listBox?Я был бы очень рад, если бы у кого-нибудь были советы, которые бы помогли сделать это!

Ответы [ 3 ]

2 голосов
/ 18 февраля 2012

Во-первых, я бы порекомендовал не использовать статические члены, просто кажется, что без него лучше работать.

Незначительные изменения в 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 <>вместо этого используется ObservableCollection <>.

В 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>

В коде (файл .cs, соответствующий файлу xaml):

    private ShoppingListItems _shoppingList;

    public MainWindow()
    {
        InitializeComponent();

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

РЕДАКТИРОВАТЬ:

То, что я сделал, было поместить шаблон данных в ресурсы сетки, а шаблон данных как часть ресурсов списка.Насколько я могу судить, единственная реальная разница заключается в том, что если шаблон является частью ресурсов сетки, его можно использовать в нескольких местах.Скажем, вы хотели два списка покупок, может быть, один для вещей, которые вам нужны, и другой для вещей, которые вы уже купили, и вы хотели, чтобы они форматировались одинаково, было бы лучше поместить шаблон в сетку, чтобы оба списка могли ссылаться на него,Поскольку у вас есть только один список, это, вероятно, не имеет значения, в любом случае это нормально.

Что касается паттерна синглтона, см. Синглтон в Википедии

Самый простой подходваши ShoppingListItems будут выглядеть так:

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 голос
/ 18 февраля 2012

Вы пытались изменить ItemCollection на ObservableCollection вместо List?

0 голосов
/ 20 февраля 2012

Спасибо тебе, Зик, изменения кода сработали.В моем коде XAML я только изменился на ItemSource = "{Binding}".

Я действительно не понимаю ваш последний комментарий.Нужно сделать поиск в Google, чтобы попытаться понять, все, что я делаю, почти новое для меня:)

Мой XAML-код для списка элементов теперь выглядит так:на основной сетке у меня есть это:

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

Кажется, это прекрасно работает.Но если это лучше, что я должен изменить, чтобы добавить ваш код, например:

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

и

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