wp8 の telerik の UI コントロールの一部である RadDataForm を使用しています。私が抱えている問題は、コントロールに関連しているとは思いませんが、私が行った、または理解していない愚かなことに関係しています。
ProfileFormData というクラスがあり、DataForm に DatField を設定するために使用されます。シングルトンにある Profile と呼ばれるクラスからプロパティを取得します。
わかりましたので、最初にコードを。
Public class Profile
{
Public sting Name {get;set;}
Public int Gender {get;set;}
}
シングルトン
public sealed class Globals
{
/// <summary>
/// Current profile
/// </summary>
public Profile profile
private static readonly SingleInstance<Globals> lazy =
new SingleInstance<Globals>(() => new Globals());
public static Globals Instance { get { return lazy.Instance; } }
}
internal sealed class SingleInstance<T> where T : class
{
private readonly Object m_lockObj = new object();
private readonly Func<T> m_delegate;
private Boolean m_isDelegateInvoked;
private T m_value;
/// <summary>
/// Initializes a new instance of the
/// <see cref="SingleInstance<T>"/> class.
/// </summary>
public SingleInstance() : this(() => default(T)) { }
/// <summary>
/// Initializes a new instance of the
/// <see cref="SingleInstance<T>"/> class.
/// </summary>
/// <param name="delegate">The @delegate</param>
public SingleInstance(Func<T> @delegate)
{
m_delegate = @delegate;
}
/// <summary>
/// gets the instance
/// </summary>
/// <value>The instance</value>
public T Instance
{
get
{
if (!m_isDelegateInvoked)
{
T temp = m_delegate();
Interlocked.CompareExchange<T>(ref m_value, temp, null);
Boolean lockTaken = false;
try
{
// WP7 does not support the overload with the
// boolean indicating if the Lock was taken
Monitor.Enter(m_lockObj); lockTaken = true;
m_isDelegateInvoked = true;
}
finally
{
if (lockTaken) { Monitor.Exit(m_lockObj); }
}
}
return m_value;
}
}
}
ProfileFormData
public class ProfileFormData
{
public string Name
{
get { return Globals.Instance.profile.UserName; }
set { Globals.Instance.profile.UserName = value; }
}
[GenericListEditor(typeof(GenderInfoProvider))]
public Gender Gender
{
get { return (Gender)Globals.Instance.profile.Gender; }
set { Globals.Instance.profile.Gender = (int)value; }
}
}
そして今、ブレンドとvsデザイナーの両方でエラーが表示されるxaml
<Grid Grid.Row="1" Margin="0,6,0,6">
<ScrollViewer>
<telerikInput:RadDataForm Grid.Row="1" Margin="12,0,12,12" x:Name="DataForm">
<telerikInput:RadDataForm.CurrentItem>
<models:ProfileFormData/>
</telerikInput:RadDataForm.CurrentItem>
<Grid>
<telerikInput:DataField Header="Name" TargetProperty="Name"/>
<telerikInput:DataField Header="Gender" TargetProperty="Gender"/>
</Grid>
</telerikInput:RadDataForm>
</ScrollViewer>
</Grid>
上記のすべての xaml の下に赤い線があり、エラーが発生します
オブジェクトがオブジェクトのインスタンスに設定されていません
アプリのデプロイと実行は正常に機能します。
ああ、私は App.xaml.c でこのようなプロファイルを作成します
/// <summary>
/// Constructor for the Application object.
/// </summary>
public App()
{
// Global handler for uncaught exceptions.
UnhandledException += Application_UnhandledException;
// Standard Silverlight initialization
InitializeComponent();
// Phone-specific initialization
InitializePhoneApplication();
Globals.Instance.profile = new Profile();
}