2017-12-30 45 views
1

나는 ListView의 itemsource를 Observable Animal 클래스 모음에 바인딩했습니다.WPF ListView 런타임에 업데이트되지 않습니다

창이로드되면 listview에서 모든 항목을 올바르게 표시합니다.

그러나 listview를 업데이트하지 않은 observablecollection에서 항목을 삭제하는 버튼이 있습니다.

예상 동작 : 버튼을 클릭하여 UI를 관찰 할 수있는 컬렉션의 첫 번째 항목을 삭제하고 업데이트해야

관찰 된 동작 : 버튼 클릭이 관찰 컬렉션의 첫 번째 항목을 삭제해야하지만, UI

public class Animal 
{ 
    public int Num { get; set; } 
    public string Name { get; set; } 
} 


public class ViewModel:INotifyPropertyChanged 
{ 
    private ObservableCollection<Animal> animals; 

    public ObservableCollection<Animal> Animals 
    { 
     get { return animals; } 
     set { animals = value; OnPropertyChanged("Animals"); } 
    } 

    public ViewModel() 
    { 
     Animals = new ObservableCollection<Animal>() 
     { 
      new Animal(){ Name="ASD", Num = 1}, 
      new Animal(){ Name="XYZ", Num = 2}, 
     }; 
    } 
    public void Run() 
    { 
     Animals.RemoveAt(0); 
    } 
    public event PropertyChangedEventHandler PropertyChanged; 
    // Create the OnPropertyChanged method to raise the event 
    private void OnPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 



<Grid DataContext="{Binding Source={StaticResource ViewModelDataSource}}"> 
    <Button Content="Button" HorizontalAlignment="Left" Height="20" Margin="70,285,0,0" VerticalAlignment="Top" Width="100" Click="Button_Click"/> 
    <ListView x:Name="mylistview" HorizontalAlignment="Left" Height="212" Margin="42,47,0,0" VerticalAlignment="Top" Width="446" ItemsSource="{Binding Animals}"> 
     <ListView.ItemTemplate> 
      <DataTemplate> 
       <StackPanel Orientation="Horizontal"> 
        <Label Content="{Binding Num}"/> 
        <Label Content="{Binding Name}"/> 
       </StackPanel> 
      </DataTemplate> 
     </ListView.ItemTemplate> 
    </ListView> 

</Grid> 



public partial class MainWindow : Window 
     { 
      private ViewModel vm; 
      public MainWindow() 
      { 
       InitializeComponent(); 
       vm = new ViewModel(); 
      } 

      private void Button_Click(object sender, System.Windows.RoutedEventArgs e) 
      { 
       vm.Run(); 
      } 
     } 
를 업데이트하지 않았습니다

답변

1

ListView는 DataContext="{Binding Source={StaticResource ViewModelDataSource}}을 사용합니다.

창에서 뷰 모델 (vm = new ViewModel();) 인스턴스를 만듭니다. 그 후에 당신은 2 개의 다른 인스턴스와 컬렉션을 가지고 있습니다. vm.Run();이 아니며보기에 연결된 인 컬렉션에서 항목을 제거합니다. 또한 DataContext를 세터 단순화 할 수

public MainWindow() 
{ 
    InitializeComponent(); 
    vm = (ViewModel)this.FindResource("ViewModelDataSource"); 
} 

:

`DataContext="{StaticResource ViewModelDataSource}"` 


당신은 하나 개의 인스턴스와 함께 작동, 그래서보기에 사용되는 것과 동일한 자원을 찾기 위해 시도해야 MVVM을 따르고 뒤에 코드를 없애는 것이 바람직합니다 :

1] viewmodel의 명령 속성을 선언하십시오

public ICommand RunCmd { get; private set; } 

2] 일부 기성 ICommand 구현을 사용하십시오. RelayCommand 또는 DelegateCommand 및 뷰 모델에서 생성자 RunCmd 속성을 초기화 :

RunCmd = new RelayCommand(Run); 

3] 그 커맨드에 바인딩 버튼 : Click 핸들러가 제거되었는지

<Button Content="Button" 
     HorizontalAlignment="Left" 
     Height="20" Width="100" Margin="70,285,0,0" 
     VerticalAlignment="Top" 
     Command="{Binding RunCmd}"/> 

참고

관련 문제