2016-07-11 11 views
0

Я совершенно новый, в основном, все это, и я пытаюсь изучить C# в контексте MVVM. Это будет простая программа CRUD, и сейчас я застреваю в деле удаления ComboBoxSelectedItem из соответствующей коллекции.Удаление ComboBox SelectedItem из коллекции

Соответствующий код ViewModel:

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 


} 

Соответствующий код модели:

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); 
    } 

Соответствующие 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> 

И, конечно, ошибки в Output:

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') 

Я подозреваю, что это ошибка с моими привязками к данным, но мне сложно определить значение ошибок. Я был бы признателен за любую точку зрения о том, что происходит не так!

+0

И что такое дублированные экземпляры виртуальной машины, одна из которых является ресурсом DataContext? –

ответ

2
  1. SelectedItem должно быть общедоступным. Привязки нуждаются в этом.
  2. Вы пытаетесь привязать метод (DeleteItem), а не команду (DeleteCommand).
+0

Спасибо! Они кажутся такими простыми вещами, поэтому неловко упускать из виду, но, как я уже сказал, я совершенно новый для всей этой концепции и обучения, это процесс. Не могли бы вы рассказать о том, что вы подразумеваете под «view-first» в своем предыдущем комментарии? И дублируемая ВМ? Это действительно помогло бы. – korina

+1

У вас есть экземпляры виртуальных машин как в «Window.DataContext», так и «Window.Resources». В «DataContext» должен быть только один, или вы создаете его в ресурсах и позже ссылаетесь на «DataContext». Первый вид означает, что вы создаете модель представления в представлении, как и вы (дважды). Как я вижу, это плохой подход, который WPF готов решать правильно во всех случаях. Альтернативой является view-model-first. Поиск google или переполнение стека для получения дополнительной информации. –

+0

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

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