2011-01-14 19 views
0

私はWPFでアプリケーションを作成しています。カスタムクラスのObservableCollection <にバインドされたListBoxがあります。データは、ObservableCollection <>の項目を削除するためのDELETEボタンを持つdataTemplateを使用して表示されます。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スタイルで書き直すことを検討する必要があります。このようにして、製品のリストを所有するビューモデルが作成され、そのビューモデルはコレクションからアイテムを削除するDeleteコマンドを定義します。

もう1つのヒント。バインドできるようにSelfプロパティを定義する必要はありません。バインディング拡張は、パラメータなしで使用できます。

<Button Name="btRemoveAllItems" Content="X" 
     Command="Delete" CommandParameter="{Binding}"> 
関連する問題