WPF コンテンツ モデルを理解します。http://msdn.microsoft.com/en-us/library/bb613548.aspx
「コンテンツ」プロパティを持つものは、基本的に 2 つの方法で動作します。「コンテンツ」がから派生したものに設定されているUIElement
場合、クラスは独自のプレゼンテーションを管理します。ただし、それ以外のものは.ToString()
呼び出されるだけで、代わりにテキストが表示されます。
これが長期的に意味することは、WPF のすべてが何でも表示できるということです。ボタンにボタンを表示したい場合は、できます。例えば:
<Button>
<Button.Content>
<Button Content="This will show as text" />
</Button.Content>
</Button>
内側のボタンにはテキストがありますが、外側のボタンには a が表示されButton
ます。Button
UIElement
上記の画像の例では、グラフィック情報を入力したいListBox
es/があります。DataGrid
これを試してください:
<ListBox HorizontalContentAlignment="Stretch">
<ListBox.Items>
<Button Content="One"/>
<Button Content="Two"/>
<Button Content="Three"/>
<Button Content="Four"/>
</ListBox.Items>
</ListBox>
Buttons
これで、Text の代わりに表示される ListBox ができました。これをさらに一歩進めて、アイテムをスタックパネルに含めることができます。次に例を示します。
<ListBox HorizontalContentAlignment="Stretch">
<ListBox.Items>
<StackPanel Orientation="Horizontal">
<Button Content="A button"/>
<Label Content="Some text" />
</StackPanel>
<StackPanel Orientation="Horizontal">
<Button Content="A button"/>
<Label Content="Some text" />
</StackPanel>
<StackPanel Orientation="Horizontal">
<Button Content="A button"/>
<Label Content="Some text" />
</StackPanel>
</ListBox.Items>
</ListBox>
これで、レイアウト コンテナーを含む項目ができました (StackPanels
には、他の要素が含まれます)。
ただし、を別のItemsSource
場所に設定すると、実際には a を使用しDataTemplate
てコンテンツを表示できます。ADataTemplate
は事実上、特定のクラスを対象とし、XAML で定義されているようにその内容をレイアウトします。検討:
コードビハインド:
public partial class MyWindow : UserControl {
public MyWindow() {
InitializeComponent();
MyListBox.ItemsSource = new List<Person> {
new Person("Sam", "Smith"),
new Person("Jim", "Henson"),
new Person("Betty", "White"),
};
}
XAML:
<ListBox HorizontalContentAlignment="Stretch" x:Name="MyListBox" >
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" >
<Label Content="{Binding FirstName}"/>
<Label Content="{Binding LastName}"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Listbox が表示されると、ItemsSource
プロパティ内の各項目が順番に表示され、DataTemplate を使用してそれらが配置されます。DataTemplate
ポリモーフィズムを使用している場合は、プロパティを使用してターゲット固有のクラスを持つことがDataType
できます (すべて ' から派生する '顧客' や '従業員' などのさまざまなタイプの人々のようにPerson
)。
このアプローチの問題点は、アイテムの値を直接設定していることです。これは悪い形式です。ビューのすべてのデータを個別に処理するクラスを定義することをお勧めします。検討:
public class ViewModel {
// WPF will automatically read these properties using reflection.
public List<Person> People {
get {
return new List<Person> {
new Person("Sam", "Smith"),
new Person("Jim", "Henson"),
new Person("Betty", "White")
};
}
}
}
ビューのすべてのデータが保持されます。実際のウィンドウに追加しましょう。まず、名前空間を参照する必要があります (「xmlns」は xml 名前空間を意味します)。
<Window x:Class="Sharp.MyWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:lol="clr-namespace:Sharp">
名前空間はSharp
(私のものが存在する名前空間) であり、それに与えるエイリアスは ですlol
。次のように、クラスをプロパティにViewModel
設定して、クラスをウィンドウにアタッチします。DataContext
<Window>
<Window.DataContext>
<lol:ViewModel />
</Window.DataContext>
</Window>
これにより、クラスのすべてのパブリック プロパティが で使用できるようになります。このように、情報をに読み込みたい場合は、単に次のように言います。ViewModel
Window
Persons
ListBox
<ListBox HorizontalContentAlignment="Stretch" ItemsSource="{Binding People}" >
...
</ListBox>
ということに注意してください。これは、 「People」と呼ばれるパブリック プロパティをItemsSource={Binding People}
スキャンし、それらの結果を取得することを意味します。ViewModel
これは本質的に、MVVM アプローチの背後にある基本です。でメインのアプリケーション操作を処理する 1 つまたは複数のクラスにすべてのビジネス ロジックを含めるModel
ことができますが、ViewModel
とやり取りしてModel
結果をパブリック プロパティとして公開する があります。WPF は自動的にこれらのプロパティにバインドし、それらを表示します。強制的に値を設定するのではなく、情報が流れるだけです。
WPF がどのように機能するかを本当に理解するには、MVVM の基本を理解するのに時間がかかります。WPF は実際には MVVM を念頭に置いて設計されているため、WPF がどのように機能するかを実際に理解するには、時間をかけて理解する必要があります。http://agilewarrior.wordpress.com/2011/01/11/simple-mvvm-walkthrough-part-i/をご覧ください
。