我有以下课程:
public abstract class TestBase<T> : INotifyPropertyChanged where T : class
{
private static T _instance;
public event PropertyChangedEventHandler PropertyChanged;
public static T Instance
{
get
{
lock (Lock)
{
var instance = _instance ?? (Activator.CreateInstance<T>());
_instance = instance;
return instance;
}
}
}
// ReSharper disable once StaticMemberInGenericType
public static object Lock = new object();
protected virtual void OnPropertyChanged(string propertyName)
{
var handler = PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
public class Test : TestBase<Test>
{
private bool _isDone = true;
public bool IsDone
{
get
{
return _isDone;
}
set
{
_isDone = value;
}
}
}
然后,我在xaml声明了这个:
<lib:Test x:Key="Test" />
并像这样使用:
IsChecked="{Binding Source={StaticResource Test}, Path=Instance.IsDone}"
这在Vista及更高版本上运行良好,但不在XP上,它只是没有绑定(回退到默认值)。我们希望我们可以放弃XP,但事实并非如此。我试图通过Snoop找到更多信息,但它在我们所有的XP机器上都崩溃了。我在这里拍摄空白并且没有想法,所以我很好奇这里是否有人对此问题有任何想法。
作为一种解决方法,我可以在Test类中添加类似的内容:
public static Test InstanceXP
{
get
{
return Instance;
}
}
但这是一个糟糕的解决方法。
答案 0 :(得分:0)
我神奇地偶然发现了另一种适用于Windows XP的解决方法。
不是在&lt; ... Resources&gt;中声明它,而是使用以下表示法:
{Binding Source={x:Static lib:Test.Instance}, Path=IsDone}
这适用于所有Windows版本。