2016-07-11 22 views
0

Ich bin im Grunde alles neu und versuche C# im Zusammenhang mit MVVM zu lernen. Dies wird ein einfaches CRUD-Programm sein und im Moment stecke ich auf der Löschung eines ComboBoxSelectedItem aus der entsprechenden Sammlung.Löschen ComboBox SelectedItem aus der Sammlung

Relevante Ansichtsmodell Code:

public class AlbumViewModel 
{ 
    private ObservableCollection<AlbumModel> albums; 

    public AlbumViewModel() 
    { 
     this.albums = new ObservableCollection<AlbumModel>(); 
     LoadAlbums(); 
    } 

    public ObservableCollection<AlbumModel> Albums 
    { 
     get { return this.albums; } 
    } 

    public void LoadAlbums() 
    { 
     albums.Add(new AlbumModel("No Love/Deep Web", "Death Grips")); 
     albums.Add(new AlbumModel("In Defense of the Genre", "Say Anything")); 
     albums.Add(new AlbumModel("Picaresque", "The Decemberists")); 
     albums.Add(new AlbumModel("In Evening Air", "Future Islands")); 
     albums.Add(new AlbumModel("You're Gonna Miss It All", "Modern Baseball")); 
    } 

    #region RelayCommand 
    private RelayCommand _deleteCommand; 

    public ICommand DeleteCommand 
    { 
     get 
     { 
      if (_deleteCommand == null) 
      { 
       _deleteCommand = new RelayCommand(param => DeleteItem()); 
      } 

      return _deleteCommand; 
     } 
    } 
    #endregion 

    #region DeleteItem() 
    private AlbumModel SelectedItem { get; set; } 

    private void DeleteItem() 
    { 
     if (SelectedItem != null) 
     { 
      this.albums.Remove(SelectedItem); 
      this.SelectedItem = null; 
     } 
    } 
    #endregion 


} 

Relevante Modellcode:

public class AlbumModel : INotifyPropertyChanged 
{ 
    #region INotifyPropertyChanged 
    public event PropertyChangedEventHandler PropertyChanged; 

    protected void RaisePropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
    #endregion 

    // AlbumModel members, properties, constructor 
} 

#region RelayCommand 
public class RelayCommand : ICommand 
{ 
    // fields 
    readonly Action<object> _execute; 
    readonly Predicate<object> _canExecute; 

    // ctors 
    public RelayCommand(Action<object> execute) 
     : this(execute, null) 
    { 

    } 

    public RelayCommand(Action<object> execute, Predicate<object> canExecute) 
    { 
     if (execute == null) 
      throw new ArgumentNullException("execute"); 

     _execute = execute; 
     _canExecute = canExecute; 
    } 

    // ICommand members 
    public bool CanExecute(object parameter) 
    { 
     return _canExecute == null ? true : _canExecute(parameter); 
    } 

    public event EventHandler CanExecuteChanged 
    { 
     add { CommandManager.RequerySuggested += value; } 
     remove { CommandManager.RequerySuggested += value; } 
    } 

    public void Execute(object parameter) 
    { 
     _execute(parameter); 
    } 

Relevante XAML:

<Window x:Class="AlbumsCRUD2.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:AlbumsCRUD2.ViewModels" 
    Title="MainWindow" Height="350" Width="525"> 
<Window.DataContext> 
    <local:AlbumViewModel /> 
</Window.DataContext> 
<Window.Resources> 
    <local:AlbumViewModel x:Key="albums" /> 
</Window.Resources> 
<Grid> 
<GroupBox Grid.Row="1" Grid.Column="1" HorizontalContentAlignment="Center" Header="View Existing"> 
     <StackPanel> 
      <Label Content="Album" /> 

      <ComboBox Name="albumComboBox" 
         ItemsSource="{Binding Path=Albums}" 
         DisplayMemberPath="AlbumName" 
         SelectedItem="{Binding SelectedItem, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> 

      <Label Content="Artist" /> 
      <TextBox Text="{Binding ElementName=albumComboBox, Path=SelectedItem.ArtistName}" 
        IsEnabled="False" /> 

      <Button Name="deleteBtn" Width="100" Margin="30" 
        Command="{Binding DeleteItem}" 
        Content="Delete" /> 
     </StackPanel> 
    </GroupBox> 
</Grid> 
</Window> 

Und natürlich, die Fehler in Ausgabe:

System.Windows.Data Error: 40 : BindingExpression path error: 'SelectedItem' property not found on 'object' ''AlbumViewModel' (HashCode=12507741)'. BindingExpression:Path=SelectedItem; DataItem='AlbumViewModel' (HashCode=12507741); target element is 'ComboBox' (Name='albumComboBox'); target property is 'SelectedItem' (type 'Object') 
System.Windows.Data Error: 40 : BindingExpression path error: 'DeleteItem' property not found on 'object' ''AlbumViewModel' (HashCode=12507741)'. BindingExpression:Path=DeleteItem; DataItem='AlbumViewModel' (HashCode=12507741); target element is 'Button' (Name='deleteBtn'); target property is 'Command' (type 'ICommand') 

Ich vermute, dass es ein Fehler mit meinen Datenbindungen ist, aber es fällt mir schwer, die Bedeutung der Fehler zu entschlüsseln. Ich würde mich über jede Perspektive freuen, was falsch läuft!

+0

Und was ist mit den doppelten VM-Instanzen, eine in den Ressourcen als DataContext? –

Antwort

2
  1. SelectedItem sollte öffentlich sein. Bindungen brauchen das.
  2. Sie versuchen, an die Methode (DeleteItem) zu binden, nicht an den Befehl (DeleteCommand).
+0

Danke! Sie scheinen so einfache Dinge zu sein, dass es peinlich ist, sie zu übersehen, aber wie ich schon sagte, ich bin völlig neu in diesem ganzen Konzept und zu lernen, dass es ein Prozess ist. Können Sie in Ihrem vorherigen Kommentar näher erläutern, was Sie mit "View-First" meinen? Und die doppelte VM? Es würde wirklich helfen. – korina

+1

Sie haben VM-Instanzen sowohl in "Window.DataContext" als auch in "Window.Resources". Es sollte nur eine in 'DataContext' vorhanden sein, oder Sie erstellen eine in Ressourcen und referenzieren sie später in 'DataContext'. View-first bedeutet, dass Sie das Ansichtsmodell in der Ansicht wie zuvor (zweimal) erstellen. Wie ich es sehe, ist es ein schlechter Ansatz, auf den WPF in allen Fällen vorbereitet ist. Die Alternative ist View-Model-First. Suchen Sie google oder stack-overflow für weitere Informationen. –

+0

@korina: http://stackoverflow.com/questions/3763072/what-are-the-pros-and-cons-of-view-first-vs-viewmodel-first-in-the-mvvm-pattern –