2012-04-30 4 views
1

wpfでユーザコントロールを作成しました。これはテキストボックスとリストビューで構成されています。今、私はこのコントロールを使用するフォームからクラスビューをリストビューにバインドしたいと思います。ですから、基本的には、リストビューのバインディングを動的に設定したいと思います。クラスオブジェクトをwpfのリストビューにバインドする

これは簡単かもしれませんが、私はこれを私にとって巨大な仕事にしているwpfには新しいです。これを解決する方法を提案してください。

答えて

5

ListViewItemsSourceプロパティをクラスインスタンスのコレクションにバインドする必要があります(ObservableCollectionを使用することをお勧めします)。たとえば、ListViewDataContextにコレクションを配置することができます。そして、結合が可能になるだけで

<ListView ItemsSource={Binding} .../> 

あなたのUserControlが必要とUserControlDataContextに、このクラスのインスタンスを渡すことができ、他のオブジェクトとともに、このコレクションを格納するためのクラスを作成することがより有用です。これはMVVMパターンを指します。

EDIT

あなたはDataContextのいずれかでコードビハインドまたはXAMLで設定することができます。我々は、コレクションを持つクラスを持っているとしましょう:

public class ViewModel 
{ 
    public ViewModel() 
    { 
     Products = new ObservableCollection<Product>() 
     { 
      new Product("book"), 
      new Product("chair"), 
      new Product("table"), 
      new Product("bookshelf"), 
     } 
    } 

    ObservableCollection<Product> Products { get; set; } 
} 

は、ここでは、コードにUserControlのDataContextのを設定する方法は次のとおりです。

ユーザーコントロールは、ユーザーコントロールのインスタンスである
userControl.DataContext = new ViewModel(); 

。ここで

は、XAMLでで行う方法は次のとおりです。

<UserControl ... 
      xmlns:vm="namespace_containing_class_ViewModel"> 
    <UserControl.DataContext> 
     <!-- Following line instantiates the ViewModel class and calls its parameterless constructor --> 
     <vm:ViewModel /> 
    </UserControl.DataContext> 

    ... 
    <ListView ItemsSource="{Binding Products}"/> 
    ... 
</UserControl> 

両方の変異体はまったく同じことを行います。 ItemsSource="{Binding Products}"は、Binding.Pathプロパティが "Products"に設定され、このパスがListViewのDataContextで検索されることを意味します。 ListViewのDataContextが上記のように明示的に設定されていない場合、DataContextはその親のDataContextと同じです。親のDataContextが設定されていない場合、親のDataContextなどと同じです。したがってこの場合、ListViewのDataContextはUserControlのDataContextと同じで、ViewModelクラスのインスタンスであり、Productのコレクションを含みます。タダ! :)

+0

DataContextを設定するサンプルコードを用意してください。 DataContextが設定されると、ItemsSource = {Binding}がバインディングを処理しますか? – Harsh

+0

私の編集を参照してください – EvAlex

+0

ありがとう@EvAlex。 :) – Harsh

関連する問題