2016-04-14 14 views
0

MVVMを初めて使用しています。ObservableCollectionをListviewにバインドしようとしています。ListViewにObservableCollectionをバインドするMVVMが動作しません。

のViewModel

namespace Multiwindow.Viewmodel 
{ 

    public class ViewModelBase 
    { 
     public Commandclass Cclass { get; set; } 

     private ObservableCollection<Person> observableprsn = new ObservableCollection<Person>(); 

     public ViewModelBase() 
     { 
      Cclass = new Commandclass(this); 
     } 

     public void oncommand() 
     { 
      for (int i = 0; i < 5; i++) 
      { 
       Person p = new Person(); 
       p.Name = "name"; 
       p.Lastname = "lastname" + i; 
       observableprsn.Add(p); 
      }   
     } 
    } 
} 

私は私は間違っpropert名と姓を持つクラスの人のループ内でいくつかのデータをリストビューと結合していボタンクリックで表示

<Window.Resources> 
     <m:Person x:Key="personmodel"/> 
     <vm:ViewModelBase x:Key="vmodel"/> 
    </Window.Resources> 

    <Grid Background="Gray" DataContext="{StaticResource vmodel}"> 

      <Button Content="Load Window 2" Margin="155,108,177,157" 
        Command="{Binding Cclass, Source={StaticResource vmodel}}" /> 

      <ListView HorizontalAlignment="Left" Height="100" Width="184" 
         DataContext="{Binding Source={StaticResource vmodel}}" 
         ItemsSource="{Binding }"> 
       <ListView.View> 
        <GridView> 
         <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}"/> 
         <GridViewColumn Header="Address" DisplayMemberBinding="{Binding Lastname}"/> 
        </GridView> 
       </ListView.View> 
      </ListView> 

     </Grid> 

。ありがとう

+0

なぜ 'のItemsSource = "{バインディングを}" が必要> 'observableprsn'の場合は空のままです – Eldho

+0

アプリケーションにバインディングエラーはありますか?バインディングエラーの出力 – Eldho

+0

エラーはありません。ItemsSource = "{Binding observableprsn}">を試しましたが、影響はありません。 – shiv

答えて

1
​​

あなたはPublicコレクション

public ObservableCollection<Person> Persons 
    { 
     get { return _observableprsn; } 
     set 
     { 
      if (_observableprsn != value) 
      { 
       _observableprsn = value; 
      } 
     } 
    } 

    private ObservableCollection<Person> _observableprsn { get; set; } 

XAML(これは私のために動作します)

<ListView HorizontalAlignment="Left" Height="100" Width="184" 
        ItemsSource="{Binding Persons}"> 
     <ListView.View> 
      <GridView> 
       <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}"/> 
       <GridViewColumn Header="Address" DisplayMemberBinding="{Binding lastName}"/> 
      </GridView> 
     </ListView.View> 
    </ListView> 
0

ビューでバインドするプロパティは、DependencyPropertyまたはINotifyPropertyChangedのいずれかにする必要があります。これらのプロパティは、publicである必要があります。

は、このようなあなたのViewModelを実装します。

public class ViewModelBase : INotifyPropertyChanged 
{ 
    private ObservableCollection<Person> _observableprsn = new ObservableCollection<Person>(); 

    public ObservableCollection<Person> Persons 
    { 
     get { return _observableprsn; } 
     set 
     { 
      if (_observableprsn != value) 
      { 
       _observableprsn = value; 
       RaisePropertyChanged(() => Persons); 
      } 
     } 
    } 

    #region implementation of INotifyPropertyChanged 

    public event PropertyChangedEventHandler PropertyChanged; 

    [NotifyPropertyChangedInvocatorAttribute] 
    protected virtual void RaisePropertyChanged<T>(Expression<Func<T>> propertyExpression) 
    { 
     var propertyName = ExtractPropertyName(propertyExpression); 
     this.RaisePropertyChanged(propertyName); 
    } 

    [NotifyPropertyChangedInvocator] 
    protected virtual void RaisePropertyChanged(string propertyName) 
    { 
     OnPropertyChanged(new PropertyChangedEventArgs(propertyName)); 
    } 

    [NotifyPropertyChangedInvocator] 
    protected virtual void OnPropertyChanged(PropertyChangedEventArgs e) 
    { 
     PropertyChanged?.Invoke(this, e); 
    } 

    private static string ExtractPropertyName<T>(Expression<Func<T>> propertyExpression) 
    { 
     if (propertyExpression == null) 
     { 
      throw new ArgumentNullException("propertyExpression"); 
     } 

     var memberExpression = propertyExpression.Body as MemberExpression; 
     if (memberExpression == null) 
     { 
      throw new ArgumentException("The expression is not a member access expression.", "propertyExpression"); 
     } 

     var property = memberExpression.Member as PropertyInfo; 
     if (property == null) 
     { 
      throw new ArgumentException("The member access expression does not access a property.", "propertyExpression"); 
     } 

     var getMethod = property.GetGetMethod(true); 
     if (getMethod.IsStatic) 
     { 
      throw new ArgumentException("The referenced property is a static property.", "propertyExpression"); 
     } 

     return memberExpression.Member.Name; 
    } 
    #endregion 
} 

Personクラスはもちろん、DependencyPropertyINotifyPropertyChangedを実装する必要がありますどちらか。代わりに、私有財産の

+0

'ObservableCollection'は' Add'または 'Remove'が発生したときに' collectionChanged event'を呼び出すと思います。プロパティが変更されたときに 'RaiseProperty'だけが必要です。私が間違っている場合は私を修正してください – Eldho

+1

正しい。ただし、Personのプロパティが変更された場合(Nameなど)、PersonクラスがPropertyChangedイベントを発生させない限り、Viewに反映されません。 –

+0

OPで 'Add()'が呼び出されたので自動的に更新されると仮定します – Eldho

関連する問題