2

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

これは単純かもしれませんが、これを私にとって大きなタスクにしているwpfは初めてです。このための解決策を提案してください。

4

1 に答える 1

6

ListViewItemsSourceプロパティをクラス インスタンスのコレクションにバインドする必要があります (これには ObservableCollection を使用することをお勧めします)。たとえば、コレクションをListViewのに配置できます。DataContextその後、バインディングはちょうど

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

このコレクションを含むクラスを作成し、必要な他のオブジェクトとともにこのクラスのインスタンスを に渡すと、より便利UserControlです。これはMVVMパターンを指します。UserControlDataContext

編集

コード ビハインドまたは 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 クラスのインスタンスです。タダ!:)

于 2012-04-30T07:08:12.487 に答える