2012-03-12 3 views
0

Я как новичок в WP7, так и в разработке C#. Я запутался с удалением списка. Я хочу удалить элемент через событие click (удалить данные элемента и обновить пользовательский интерфейс). Я искал на веб-сайте и знал, что первый ресурс должен расширять ObservableCollection, но как сделать дальше? Кто может дать мне более подробный пример. Вот мой код MainPage.xaml. Example source downloadУдалить элемент из списка в WP7

<phone:PhoneApplicationPage x:Class="WPListBoxImage.MainPage" 
          xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
          xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
          xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone" 
          xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone" 
          xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
          xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
          xmlns:data="clr-namespace:WPListBoxImage" 
          mc:Ignorable="d" 
          d:DesignWidth="480" 
          d:DesignHeight="768" 
          FontFamily="{StaticResource PhoneFontFamilyNormal}" 
          FontSize="{StaticResource PhoneFontSizeNormal}" 
          Foreground="{StaticResource PhoneForegroundBrush}" 
          SupportedOrientations="Portrait" 
          Orientation="Portrait" 
          shell:SystemTray.IsVisible="True"> 
    <phone:PhoneApplicationPage.Resources> 
    <data:Products x:Key="productCollection" /> 
    <data:PriceConverter x:Key="priceConvert" /> 
    </phone:PhoneApplicationPage.Resources> 
    <!--LayoutRoot is the root grid where all page content is placed--> 
    <Grid x:Name="LayoutRoot" 
     Background="Transparent"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="*" /> 
    </Grid.RowDefinitions> 
    <!--TitlePanel contains the name of the application and page title--> 
    <StackPanel x:Name="TitlePanel" 
       Grid.Row="0" 
       Margin="12,17,0,28"> 
     <TextBlock x:Name="ApplicationTitle" 
       Text="PDSA" 
       Style="{StaticResource PhoneTextNormalStyle}" /> 
     <TextBlock x:Name="PageTitle" 
       Text="Products" 
       Margin="9,-7,0,0" 
       Style="{StaticResource PhoneTextTitle1Style}" /> 
    </StackPanel> 
    <!--ContentPanel - place additional content here--> 
    <Grid x:Name="ContentPanel" 
      Grid.Row="1" 
      Margin="12,0,12,0"> 
     <ListBox x:Name="lstData" 
       ItemsSource="{Binding Source={StaticResource productCollection}, Path=DataCollection}" SelectionChanged="lstData_SelectionChanged"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
      <StackPanel Orientation="Horizontal"> 
       <Image Margin="8" 
        VerticalAlignment="Top" 
        Source="{Binding Path=ImageUri}" 
        Width="100" 
        Height="100" /> 
       <StackPanel> 
       <TextBlock Margin="8" 
          Width="250" 
          TextWrapping="Wrap" 
          VerticalAlignment="Top" 
          HorizontalAlignment="Left" 
          Text="{Binding Path=ProductName}" /> 
       <TextBlock Width="100" 
          Margin="8,0,8,8" 
          VerticalAlignment="Top" 
          HorizontalAlignment="Left" 
          Text="{Binding Path=Price, Converter={StaticResource priceConvert}}" /> 
       </StackPanel> 
      </StackPanel> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
     </ListBox> 
    </Grid> 
    </Grid> 
</phone:PhoneApplicationPage> 

MainPage.xaml.cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Animation; 
using System.Windows.Shapes; 
using Microsoft.Phone.Controls; 

namespace WPListBoxImage 
{ 
    public partial class MainPage : PhoneApplicationPage 
    { 
    // Constructor 
    public MainPage() 
    { 
     InitializeComponent(); 
    } 

    private void lstData_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 

     ListBoxItem lbi = ((sender as ListBox).SelectedItem as ListBoxItem); 
     //delete a item,what should to do next? 
    } 
    } 
} 

Products.cs

using System; 
using System.Collections.Generic; 
using System.Collections.ObjectModel; 
using System.Linq; 

namespace WPListBoxImage 
{ 
    //a ObservableCollection<T>, 
    public class Products : ObservableCollection<Product> 
    { 
    public Products() 
    { 
     DataCollection = new ObservableCollection<Product>(); 
     BuildCollection(); 
    } 

    private const string IMG_PATH = "../Images/"; 

    public ObservableCollection<Product> DataCollection { get; set; } 

    public ObservableCollection<Product> BuildCollection() 
    { 
     //DataCollection = new ObservableCollection<Product>(); 

     DataCollection.Add(new Product("Haystack Code Generator for .NET", 799, IMG_PATH + "Haystack.jpg")); 
     DataCollection.Add(new Product("Fundamentals of N-Tier eBook", Convert.ToDecimal(19.95), IMG_PATH + "FundNTier_100.jpg")); 
     DataCollection.Add(new Product("Fundamentals of ASP.NET Security eBook", Convert.ToDecimal(19.95), IMG_PATH + "FundSecurity_100.jpg")); 
     DataCollection.Add(new Product("Fundamentals of SQL Server eBook", Convert.ToDecimal(19.95), IMG_PATH + "FundSQL_100.jpg")); 
     DataCollection.Add(new Product("Fundamentals of VB.NET eBook", Convert.ToDecimal(19.95), IMG_PATH + "FundVBNet_100.jpg")); 
     DataCollection.Add(new Product("Fundamentals of .NET eBook", Convert.ToDecimal(19.95), IMG_PATH + "FundDotNet_100.jpg")); 
     DataCollection.Add(new Product("Architecting ASP.NET eBook", Convert.ToDecimal(19.95), IMG_PATH + "ArchASPNET_100.jpg")); 
     DataCollection.Add(new Product("PDSA .NET Productivity Framework", Convert.ToDecimal(2500), IMG_PATH + "framework.jpg")); 

     return DataCollection; 
    } 

    } 
} 

Product.cs

using System; 

namespace WPListBoxImage 
{ 
    public class Product 
    { 
    #region Constructors 

    public Product() 
    { 
    } 

    public Product(string name, decimal price, string imageUri) 
    { 
     this.ProductName = name; 
     this.Price = price; 
     this.ImageUri = imageUri; 
    } 
    #endregion 

    public string ProductName { get; set; } 
    public decimal Price { get; set; } 
    public string ImageUri { get; set; } 
    } 
} 

Вот приложение скриншот. enter image description here

благодарит за ваше терпение.

+0

ДОПОЛНИТЕЛЬНО: Во-первых, в строке 'ListBoxItem УКП = ((отправитель, как ListBox) .SelectedItem в ListBoxItem)', почему конвертировать ListBoxItem возвращает null.the код 'Product lbi = ((отправитель как ListBox) .SelectedItem as Product)' работал, во-вторых, ProductCollection не является ObservableCollection, который мы должны сначала преобразовать. 'MyData = productCollection.DataCollection;' затем использовать ' myData.Remove (lbi); 'для обновления интерфейса. –

ответ

2

Ваш класс продукты не должны ничего наследовать.

public class Products 

Доступ ко всем предметам в вашей коллекции осуществляется через свойство DataCollection класса Product. Например,

Products myProducts = new Products(); 
    ObservableCollection<Product> myData = myProducts.DataCollection; 

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

ObservableCollection<Product> Products = new ObservableCollection<Product>(); 
    Products.Add(new Product("Haystack Code Generator for .NET", 799, IMG_PATH + "Haystack.jpg")); 
    // etc... 
1

Во-первых, вам необходимо получить ссылку на вашу коллекцию продукции:

Products productCollection = this.Resources["productCollection"] as Products; 

Затем найдите пункт, который щелкнул, это будет DataContext из ListBoxItem:

ListBoxItem lbi = ((sender as ListBox).SelectedItem as ListBoxItem); 
Product product = lbi.DataContext as Product; 

(хотя, I думаю, что, что, как ваш список является привязкой к базе данных, SelectedItemдолжен быть примером Product. п проверить это самостоятельно в отладчике)

Затем просто удалить его, ObservableCollection будет гарантировать, что пользовательский интерфейс обновляется:

productCollection.Remove(product); 
+0

строка '((отправитель как ListBox) .SelectedItem как ListBoxItem);' return null, convert error.How можно исправить? –

+0

Вы прочитали мой ответ? См. Бит, который говорит «хотя, я думаю, что, поскольку ваш список - это привязка данных, SelectedItem должен быть экземпляром продукта» – ColinE

+0

Я думаю, что должна быть ошибка, почему '(отправитель как listBox) .SelectedItem как ListBoxItem' был неправильным раньше, есть ли какое-либо отношение между списком данных - это привязка данных?Извините, я действительно новичок –

Смежные вопросы