コードを作成してDataContext
プロパティをプログラムで設定するのではなく、XAMLでWPF StartupUriウィンドウのDataContext
オブジェクトのインスタンスを作成できるようにしたいと思います。
主な理由は、外部で作成されたオブジェクトにアクセスする必要がないことと、DataContext
を設定するためだけに背後でコードを記述する必要がないことです。
XAMLでDataContext
オブジェクトをインスタンス化する方法をどこかで読んだことは確かですが、通常の場所では見つかりません...
DataContextが存在する名前空間にXML名前空間を追加し、ウィンドウリソースにそのインスタンスを作成して、DataContextをそのリソースに設定します。
<Window x:Class="WpfApplication4.Window1"
xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication4"
Title="Window1" Height="300" Width="300">
<Window.Resources>
<local:MyViewModel x:Key="MyViewModel"/>
</Window.Resources>
<Grid DataContext="{StaticResource MyViewModel}">
</Grid>
</Window>
これをXAMLで直接ウィンドウ全体に指定できます。
<Window
... xmlns definitions ...
>
<Window.DataContext>
<local:CustomViewModel />
</Window.DataContext>
</Window>
これにより、ローカルにエイリアスされた名前空間に「CustomViewModel」という名前のビューモデルが、ウィンドウのDataContextとして直接作成されます。
このコードを想定すると:
public abstract class BaseView { }
public class RuntimeView : BaseView { }
public class DesigntimeView : BaseView { }
これを試して:
<Page.DataContext>
<local:RuntimeView />
</Page.DataContext>
<d:Page.DataContext>
<local:DesigntimeView />
</d:Page.DataContext>
<ListBox ItemsSource="{Binding}" />
がんばって!
DataContextを同じコントロールクラスとして設定する必要がある場合:
<Window x:Class="TabControl.MainWindow"
xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:TabControl"
Title="MainWindow" Height="350" Width="525"
DataContext="{Binding RelativeSource={RelativeSource Self}}"
>
</Window>
RelativeSourceバインディングを使用します。
あるいは単に
<Window x:Class="TabControl.MainWindow"
xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:TabControl"
Title="MainWindow" Height="350" Width="525"
>
<Window.DataContext>
< new instance of any viewModel here....>
</Window.DataContext>
</Window>
それ自体とは異なるクラスのインスタンスを割り当てたい場合