大家好先发帖:) 让我们从我正在使用的代码片段开始:
public MyClass : INotifyPropertyChanged
{
private static MyClass _instance;
public static MyClass Instance
{
get
{
if (_instance == null)
_instance = new MyClass();
return _instance;
}
}
private bool _myProperty;
public bool MyProperty
{
get
{
return _myProperty;
}
set
{
if (_myProperty!= value)
{
_myProperty= value;
NotifyPropertyChanged("MyProperty");
}
}
}
private MyClass() { ... }
}
如你所见,它是一个单身人士类。 在我看来,我想在MyProperty上绑定一个控件。我最初的想法是在我的视图中使用类似的东西导入MyClass作为静态资源:
<UserControl x:Class="Metrics.Silverlight.ChartView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:logic="clr-namespace:Metrics.Logic;assembly=Metrics.Logic">
<UserControl.Resources>
<logic:MyClass x:Key="myClass" />
</UserControl.Resources>
</UserControl>
然后像这样绑定它:
<Button Margin="5" Click="btnName_Click" Visibility="{Binding Source={StaticResource myClass}, Converter={StaticResource visibilityConverter}, Path=MyAttribute, Mode=OneWay}">
当然,这种方法不起作用,因为MyClass构造函数是私有的。我也不能使用x:static,因为它在Silverlight 4中不可用。
我一直坚持这个问题的时间比我应该的要长得多...... 如何在MyProperty上绑定?
有什么想法吗?
提前致谢!
答案 0 :(得分:8)
我建议添加其他课程MyClassProvider
:
public class MyClassProvider
{
public MyClass MyClass { get { return MyClass.Instance; } }
}
此类的实例可以放在任何位置并绑定到其MyClass
属性。
答案 1 :(得分:5)
你可以让你的UserControl在内部通过它自己的属性公开MyClass实例,并在本地绑定它自己的“MyClass”实例。因为它是一个单身人士,所以这将始终是同一个实例。
答案 2 :(得分:4)
你可以用不同的方式实现单独的 ,如下所示:
private static MyClass _instance;
public MyClass Instance // note the getter is not static
{
get
{
if (_instance == null)
_instance = new MyClass();
return _instance;
}
}
所以现在你可以在xaml中执行以下操作:
<UserControl x:Class="Metrics.Silverlight.ChartView"
<UserControl.Resources>
<logic:MyClass x:Key="myClass" />
</UserControl.Resources>
</UserControl>
并像这样绑定它:
<Button Margin="5" Click="btnName_Click" Visibility="{Binding Source={StaticResource myClass}, Converter={StaticResource visibilityConverter}, Path=Instance.MyAttribute, Mode=OneWay}">
注意单例仍然是单例,但我们只是通过不将getter设置为静态来绕过Silverlight缺少的静态。
答案 3 :(得分:3)
我已经验证以下是在Silverlight 5中工作的:
保持您的班级MyClass
不变,然后在您的商家UserControl类中创建名为MyClass
的{{1}}属性:
MyClass
然后在你的业务UserControl XAML中,做这样的绑定:
public MyClass MyClass
{
get { return <Namespace>.MyClass.Instance; }
}
在您的应用中的某个位置<TextBlock Text="Visibility Test" Visiblity="{Binding Path=MyClass.MyProperty, Converter={somexmlns:SomeVisiblityConverterIfNecessary}", ElementName="yourBusinessUserControlName"/>
(此处MyClass.Instance.MyProperty
是类名称)更改MyClass
的值后,上述绑定将会更新。