2017-12-11 7 views
0

내 앱에서 MVVM 패턴을 구현하려고하는데 데이터 바인딩 문제가 있습니다. ListBox에 바인딩 된 새 항목이 내 모음에 나타날 때까지 모든 것이 잘 작동합니다. ListBox가 업데이트되지 않고 ItemsControl에 대한 예외가 발생하면 해당 상자를 클릭하려고합니다.ListBox 바인딩, 바인드 된 컬렉션의 새 항목

MainView.xaml

<Window.DataContext> 
    <ViewModel:MainViewModel/> 
</Window.DataContext> 

<ListBox x:Name="Scripts" ItemsSource="{Binding Scripts, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" DisplayMemberPath="Name" SelectedItem="{Binding SelectedScript}"/> 

MainViewModel.cs

class MainViewModel : INotifyPropertyChanged 
{  

    public event PropertyChangedEventHandler PropertyChanged; 

    public List<Script> Scripts 
    { 
     get; set; 
    } 

    public RelayCommand NewScriptCommand 
    { 
     get; set; 
    } 

    public MainViewModel() 
    { 
     Scripts = Script.Scripts; 
     NewScriptCommand = new RelayCommand(NewScript); 
    } 

    private void NewScript() 
    { 
     Script.NewScript(); 
     OnPropertyChanged("Scripts"); 
    }  

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

그리고 내 모델 클래스 Script.cs

public class Script 
{ 
    private static List<Script> _scripts; 

    public static List<Script> Scripts 
    { 
     get 
     { 
      if(_scripts == null) 
      { 
       _scripts = GetScripts();      
      } 
      return _scripts; 
     } 
    } 

    public static void NewScript() 
    { 
     _scripts.Add(new Script()); 
    } 
} 

나에 대한 생각 MainViewModel에 ObservableCollection에 할, 그러나되었다 해당 컬렉션을 업데이트하는 것과 관련된 다른 문제가 발생했습니다. List<Script> 스크립트 ge 새로운 요소.

+0

오류에 대한 세부 정보를 표시 할 수 있습니까? –

+0

'System.InvalidOperationException'형식의 처리되지 않은 예외가 PresentationFramework.dll에서 발생했습니다. ItemsControl이 해당 항목의 소스와 일치하지 않습니다. 자세한 내용은 내부 예외를 참조하십시오. –

+0

'CollectionViewSource'를 사용해 보았습니까? – XAMlMAX

답변

1

목록을 ObservableCollection으로 바꾸면 모든 것이 작동하기 시작합니다. 당신이 말하는 "문제"가 무엇인지 확실하지 않습니다. OnPropertyChanged ("Scripts")를 제거하십시오. Scripts 속성이 변경되지 않았습니다 ... 컬렉션이 변경되었습니다. ObservableCollection이 수행하는 콜렉션 변경 이벤트를 발생시켜야합니다.