web-dev-qa-db-ja.com

XAMLでDataContextオブジェクトをインスタンス化する方法

コードを作成してDataContextプロパティをプログラムで設定するのではなく、XAMLでWPF StartupUriウィンドウのDataContextオブジェクトのインスタンスを作成できるようにしたいと思います。

主な理由は、外部で作成されたオブジェクトにアクセスする必要がないことと、DataContextを設定するためだけに背後でコードを記述する必要がないことです。

XAMLでDataContextオブジェクトをインスタンス化する方法をどこかで読んだことは確かですが、通常の場所では見つかりません...

28
Gus Paul

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>
33
Steven Robbins

これをXAMLで直接ウィンドウ全体に指定できます。

<Window 
    ... xmlns definitions ...
>
   <Window.DataContext>
        <local:CustomViewModel />
   </Window.DataContext>
</Window>

これにより、ローカルにエイリアスされた名前空間に「CustomViewModel」という名前のビューモデルが、ウィンドウのDataContextとして直接作成されます。

28
Reed Copsey

このコードを想定すると:

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}" />

がんばって!

15
Jerry Nixon

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>

それ自体とは異なるクラスのインスタンスを割り当てたい場合

0
Kylo Ren