2011-01-14 80 views
0

我一直在WPF上编写一个应用程序。它有一个绑定到自定义类的ObservableCollection的ListBox。使用dataTemplate显示数据,该数据模板具有DELETE按钮,用于删除ObservableCollection的项目>>。从WPF和C上的数据模板上的按钮删除ListBoxItem#

数据源收集的定义如下所示:

public class SellItem : INotifyPropertyChanged 
{ 
    private string _name, _code, _details; 

    public SellItem Self 
    { 
     get { return this; } 
    } 

    public string Name 
    { 
     get 
     { 
      return _name; 
     } 
     set 
     { 
      _name = value; 
      if (PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs("Name")); 
     } 
    } 
    public string Code 
    { 
     get 
     { 
      return _code; 
     } 
     set 
     { 
      _code = value; 
      if (PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs("Code")); 
     } 
    } 
    public string Details 
    { 
     get 
     { 
      return _details; 
     } 
     set 
     { 
      _details = value; 
      if (PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs("Details")); 
     } 
    } 
    #region INotifyPropertyChanged Members 

    public event PropertyChangedEventHandler PropertyChanged; 

    #endregion 
} 

public class ItemCollection : ObservableCollection<SellItem> 
{ 
    static public ItemCollection theCollection = null; 

    public ItemCollection() 
    { 
     theCollection = this; 

    } 
} 

的XAML代码看起来是这样的:

<Window x:Class="NALT_WPF.SaleWindow" 
    ... 
    xmlns:local="clr-namespace:NALT_WPF" 
    Title="Test" Height="494" Width="838"> 
<Window.Resources> 
    <ObjectDataProvider x:Key="theItemCollection" ObjectType="{x:Type local:ItemCollection}"/> 
</Window.Resources> 
<Window.CommandBindings> 
    <!--Using command binding--> 
    <CommandBinding Command="Delete" Executed="CommandBinding_Executed_RemoveAll" /> 
</Window.CommandBindings> 
<Grid> 
    <Grid.Resources> 
     <DataTemplate x:Key="ProductListItemTemplate"> 
      <Grid> 
       ... 
         <!-- This is the button on data template to remove the item from 'ItemCollection' --> 
         <Button Name="btRemoveAllItems" Content="X" 
           Command="Delete" CommandParameter="{Binding Self}"> 
         </Button> 
       ... 
      </Grid> 
     </DataTemplate> 
    </Grid.Resources> 
    ... 
    <ListBox Grid.Row="1" Margin="10" Name="lstProducts" 
         ItemTemplate="{StaticResource ResourceKey=ProductListItemTemplate}" 
         ItemsSource="{Binding Source={StaticResource theItemCollection}}" 
         HorizontalContentAlignment="Stretch"> 
    </ListBox> 
</Grid> 

而在主窗口C#代码:

public partial class MainWindow : Window 
{ 
    public SaleWindow() 
    { 
     InitializeComponent(); 
    } 

    ... 

    private void CommandBinding_Executed_RemoveAll(object sender, ExecutedRoutedEventArgs e) 
    { 
     // this is the code executed when DELETE button on data template is pressed. 
     // I was thinking to remove the item here 

     MessageBox.Show("Removing, proceed? ..."); 

     //... ... 

     //... 

    } 
} 

我该怎么做?从模板上的按钮所属的列表框上的集合中删除项目。该项目并不总是选定的一个。

我感谢所有帮助 :)

回答

0

事情是这样的:

private void CommandBinding_Executed_RemoveAll(object sender, ExecutedRoutedEventArgs e) 
{ 
    SellItem sellItem = (SellItem) e.Parameter; 
    var itemsCollection = (ItemCollection)lstProducts.ItemsSource; 
    itemsCollection.Remove(sellItem); 
} 

虽然,这看起来不正确。你应该考虑用MVVM风格重写这段代码。这样,您将拥有一个将拥有产品列表的视图模型,并且该视图模型将定义一个删除命令,该命令将从该集合中删除该项目。

还有一个小费。你不需要定义一个Self属性来绑定它。您可以使用不带任何参数的绑定扩展名:

<Button Name="btRemoveAllItems" Content="X" 
     Command="Delete" CommandParameter="{Binding}">