テキストボックスとリストビューで構成されるユーザーコントロールをwpfで作成しました。ここで、このコントロールを使用するフォームからリストビューにクラスオブジェクトをバインドします。したがって、基本的には、リストビューのバインディングを動的に設定したいと思います。
これは単純かもしれませんが、これを私にとって大きなタスクにしているwpfは初めてです。このための解決策を提案してください。
テキストボックスとリストビューで構成されるユーザーコントロールをwpfで作成しました。ここで、このコントロールを使用するフォームからリストビューにクラスオブジェクトをバインドします。したがって、基本的には、リストビューのバインディングを動的に設定したいと思います。
これは単純かもしれませんが、これを私にとって大きなタスクにしているwpfは初めてです。このための解決策を提案してください。
ListView
のItemsSource
プロパティをクラス インスタンスのコレクションにバインドする必要があります (これには ObservableCollection を使用することをお勧めします)。たとえば、コレクションをListView
のに配置できます。DataContext
その後、バインディングはちょうど
<ListView ItemsSource={Binding} .../>
このコレクションを含むクラスを作成し、必要な他のオブジェクトとともにこのクラスのインスタンスを に渡すと、より便利UserControl
です。これはMVVMパターンを指します。UserControl
DataContext
編集
コード ビハインドまたは xaml で DataContext を設定できます。コレクションを持つクラスがあるとしましょう:
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();
ここで、userControl は UserControl のインスタンスです。
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 と同じであり、Products のコレクションを含む ViewModel クラスのインスタンスです。タダ!:)