C# 将属性更改为依赖项对象时发生绑定错误
我使用以下代码在我的控制下使用一个等级系统:C# 将属性更改为依赖项对象时发生绑定错误,c#,wpf,bind,C#,Wpf,Bind,我使用以下代码在我的控制下使用一个等级系统: public class FlowProWorkingClass:DependencyObject { public TUnitSystemClass ProjectUnitSystem { get { return Classes.CurrentFlowProWorkingClass.GeneralOptions.listOfUnitSystems.Find(x => x
public class FlowProWorkingClass:DependencyObject
{
public TUnitSystemClass ProjectUnitSystem
{
get
{
return Classes.CurrentFlowProWorkingClass.GeneralOptions.listOfUnitSystems.Find(x => x.Id == Classes.CurrentFlowProWorkingClass.GeneralOptions.DefaultUnitSystemId);
}
set
{
throw new Exception("Project Unit System can not be setted here!");}
}
}
我已将其绑定到我的控件,如下所示:
<WPFTextBoxUnitConverterControl:TextBoxUnitConvertor
x:Name="txtGasPhaseFlowCoefficient" UnitSystem="{Binding currentFlowProWorkingClass.ProjectUnitSystem, Mode=OneWay, Source={StaticResource CurrentFlowProWorkingClass}, UpdateSourceTrigger=PropertyChanged}"
Height="27" Margin="167,245,0,0" VerticalAlignment="Top" HorizontalAlignment="Left" Width="171"/>
但是现在,控件根本没有绑定!
有什么问题吗?
注意:当我编写下面的代码时,绑定被完全忽略了!根本不调用get方法!为什么?
public static DependencyProperty ProjectUnitSystemProperty =
DependencyProperty.Register(
"ProjectUnitSystem",
typeof(TUnitSystemClass),
typeof(FlowProWorkingClass),
new PropertyMetadata(ProjectUnitSystemOnChanged));
private static void ProjectUnitSystemOnChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
}
public TUnitSystemClass ProjectUnitSystem
{
get
{
SetValue(ProjectUnitSystemProperty, Classes.CurrentFlowProWorkingClass.GeneralOptions.listOfUnitSystems.Find(x => x.Id == Classes.CurrentFlowProWorkingClass.GeneralOptions.DefaultUnitSystemId));
return (TUnitSystemClass) GetValue(ProjectUnitSystemProperty);
}
set
{
throw new Exception("Project Unit System can not be setted here!");
}
}
SetValue
设置依赖项属性的所谓本地值,该值替换以前指定的任何(单向)绑定
因此,属性getter可以有效地删除绑定。它不能调用SetValue
get
{
SetValue(ProjectUnitSystemProperty, ...); // remove this line
return (TUnitSystemClass)GetValue(ProjectUnitSystemProperty);
}
任何读/写依赖项属性的CLR包装必须与以下内容完全相同:
public PropertyType PropertyName
{
get { return (PropertyType)GetValue(PropertyNameProperty); }
set { SetValue(PropertyNameProperty, value);
}
有关只读依赖项属性,请查看MSDN上的文章。我对其进行了修订,但它们没有正确显示!请有人编辑它,因为我不能这样做!从财产设定者那里抛出例外是毫无意义的。将属性设置为只读。@clemens-必须在get中获取的另一个属性中以另一种方式设置该属性!“Classes.CurrentFlowProWorkingClass.GeneralOptions.listOfUnitSystems”没有任何意义。抛出异常的属性设置程序不应该存在。注意,我们说get和set也是过去式,而不是getted和setted。另一个注意事项是,在单向绑定上设置
UpdateSourceTrigger=PropertyChanged
。你应该移除它。作为一般规则,除非您实际需要,否则永远不要设置它。不幸的是,get必须首先从另一个属性“Classes.CurrentFlowProWorkingClass.GeneralOptions.ListoUnitSystems.Find(x=>x.Id==Classes.CurrentFlowProWorkingClass.GeneralOptions.DefaultUnitSystemId)”获取值,然后返回!依赖项属性不是这样工作的。您必须在调用getter之前调用SetValue,而不是在getter内部。我需要get返回属性“Classes.CurrentFlowProWorkingClass.GeneralOptions.listOfUni”的实时值tSystems.Find(x=>x.Id==Classes.CurrentFlowProWorkingClass.GeneralOptions.DefaultUnitSystemId)“!我可以这样做吗?不要将ProjectUnitSystem设置为依赖属性。我需要在更改时通知它,以更改绑定到它的所有控件
public PropertyType PropertyName
{
get { return (PropertyType)GetValue(PropertyNameProperty); }
set { SetValue(PropertyNameProperty, value);
}