【发布时间】:2012-02-14 13:31:43
【问题描述】:
在我的 .NET 4.0 项目中,我有一个具有公共字段的对象,并且该对象既不实现 INotifyPropertyChanged 也不继承 DependencyObject,而且它永远不会这样做。但是,我需要一种机制来“绑定”到我的 WPF 控件中此对象的字段。我知道我不能直接这样做,因为绑定需要依赖属性(或者至少需要属性和通知属性更改),所以我可以做些什么来实现我需要的绑定功能。我在我的 WPF 控件中尝试过这样的事情:
void FirePropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
public float Friction
{
get
{
if (CurrentObject != null)
{
return CurrentObject.Friction;
}
else
{
return 0.0f;
}
}
set
{
if (CurrentObject != null)
{
CurrentObject.Friction = value;
FirePropertyChanged("Friction");
}
}
}
public PlatformObjectTemplate CurrentObject
{
get
{
return GetValue(CurrentObjectProperty) as PlatformObjectTemplate;
}
set
{
SetValue(CurrentObjectProperty, value);
FirePropertyChanged("Friction");
FirePropertyChanged("CurrentObject");
BindShapes();
IntersectionComboBox.SelectedItem = CurrentObject.IntersectionStaticMethod;
}
}
public static readonly DependencyProperty CurrentObjectProperty = DependencyProperty.Register("CurrentObject", typeof(PlatformObjectTemplate), typeof(PlatformStaticObjectPropertyEditor), new PropertyMetadata(null));
我的 WPF 控件实现了 INotifyPropertyChanged,而我的 PlatformObjectTemplate 没有属性,只有像 Friction 这样的公共字段。我需要像这样在 XAML 中绑定到我的对象:
(在我的控制中)://DoubleUpDown 来自 WPF 工具包。
<tk:DoubleUpDown Margin="91,10,7,0" Name="doubleUpDown1" VerticalAlignment="Top" Value="{Binding Friction, ElementName=window, FallbackValue=0}" />
(在我的主窗口中):
<my:PlatformStaticObjectPropertyEditor x:Name="platformStaticObjectPropertyEditor1" CurrentObject="{Binding CurrentObject, ElementName=window}" />
我在 Friction 属性的 getter 中设置了一个断点,它尝试在绑定CurrentObject 之前绑定,因为它为空,所以我无法从中读取正确的摩擦值物体。我尝试在 CurrentObject 的设置器中触发 Friction 属性更改,以在设置 CurrentObject 时填充 Friction,但这也不起作用。
好的,这里有两个要求:
PlatformObjectTemplate 将不使用属性。它将有公共领域。
我需要像往常一样声明性的绑定方式,就像我在上面的 XAML 中使用的那样。
我可能把事情弄得太复杂了,而且我一定遗漏了一些东西。在我上面的要求的限制内,最“正确”和“声明”的方式是什么?
谢谢, 可以。
【问题讨论】:
-
您的输出窗口中是否出现任何绑定错误?您对控件的绑定是
Value="{Binding Friction, ElementName=window, FallbackValue=0}"- 是引用控件的根,还是引用窗口?当您触发手动更改的Friction属性时会发生什么? -
不,我在输出中没有收到关于此绑定的任何绑定错误。是的,对不起,“窗口”是指控制根本身。这是我自己让事情变得更简单的约定,我只是使用“窗口”一词来命名根,无论它是控件还是窗口。
-
创建实现 INPC 的包装器
-
我能想到的唯一其他问题是:
BindShapes方法有什么作用? -
@jberger 这是唯一的方法吗?如果是的话,把它变成一个答案,我会照着做的。
标签: wpf binding .net-4.0 dependency-properties