プロパティを App.xaml.cs に追加し、コントロールでバインドできます。
最初のアプローチ: XAML リソースとして
あなたのモデル:
public class MyViewModel
{
public int Hello { get; set; }
}
アプリ.xaml.cs:
<Application x:Class="WpfApplication12.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:wpfApplication12="clr-namespace:WpfApplication12"
StartupUri="MainWindow.xaml">
<Application.Resources>
<wpfApplication12:MyViewModel x:Key="MyViewModel" />
</Application.Resources>
</Application>
小さな注意: これはデフォルト値であるため、オブジェクトに注釈を付ける必要はありませんx:Shared="True"
。同じインスタンスが返されます。http://msdn.microsoft.com/en-us/library/aa970778.aspx
あなたのユーザーコントロール:
<UserControl x:Class="WpfApplication12.UserControl2"
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"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid DataContext="{Binding Mode=OneWay, Source={StaticResource MyViewModel}}">
<TextBlock Text="{Binding Path=Hello}" />
</Grid>
</UserControl>
モデルはリソースなので、プロパティを作成して取得できます。
public MyViewModel MyViewModel
{
get { return Application.Current.FindResource("MyViewModel") as MyViewModel; }
}
(ただし、その参照をフィールドに格納したい場合があります。)
第2のアプローチ:従来のプロパティとして
何らかの理由で従来のプロパティを好む場合は、次の構文を使用します。
プロパティは静的であり、静的コンストラクターで初期化されることに注意してください。
public partial class App : Application
{
static App()
{
MyViewModel = new MyViewModel();
}
public static MyViewModel MyViewModel { get; set; }
}
ユーザーコントロールでそれにバインドします:
<Grid DataContext="{Binding Source={x:Static wpfApplication12:App.MyViewModel}}"/>