2017-12-30 62 views
1

私はリストビューのitemsourceをObservable Animalクラスのコレクションにバインドしました。WPF 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}"` 


あなたは1つのインスタンスで動作するので、ビューで使用されているのと同じリソースを、見つけようとする必要がありますMVVMに従ってコードを取り除くことが望ましい:

1] viewmodelのコマンドプロパティを宣言する

public ICommand RunCmd { get; private set; } 

2]いくつかの既製のICommand実装を使用します。 RelayCommandまたはDelegateCommandとのviewmodelコンストラクタから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}"/> 

ノート、

関連する問題